JavaScript 警报在 Android WebView 中不起作用

Posted

技术标签:

【中文标题】JavaScript 警报在 Android WebView 中不起作用【英文标题】:JavaScript alert not working in Android WebView 【发布时间】:2011-07-13 09:58:08 【问题描述】:

在我的应用程序中,我使用的是WebView,并且我使用的是javascript alert( ) 方法,但它不起作用,没有弹出窗口出现。

在我的清单文件中我添加了

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

在活动文件中我已经添加了

mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("file:///android_asset/demo.html");

在我添加的布局xml文件中

<WebView 
    android:id="@+id/webview"
    android:layout_
    android:layout_
/>

任何线索如何在WebView 中启用完整的JavaScript


更新

谢谢马克html 文件中的 alert() 方法现在可以工作了:)。

现在WebView 有两个问题: 1:我在我正在加载的 html 文件中使用 &lt;textarea&gt; WebView ,并尝试在其中写入印地语字体,但是当我尝试编写印地语文本时,它显示为符号(矩形符号,如 [ ] ) .

当我在桌面上的 Firefox 浏览器中执行相同操作时,它工作正常。 任何线索如何在WebView 中为textarea 中的多种语言提供支持?

2:当我单击提交并尝试在另一个 java 脚本中打开 alert() 方法中的文本值时,它不起作用,这是否意味着即使使用了 WebChromeClient 它仅适用于当前加载的 html 页面,而不适用于从该页面调用的javascripts

【问题讨论】:

它是“JavaScript”,而不是“Java Script”、“java-script”或“Java script”(所有这些都出现在您的原始问题中)。我已经为你更正了。 @T.J.Crowder 我敢说它应该被称为 Javascript @KrisSelbekk:不。 :-) "JavaScript" 是 Oracle 的注册商标(必须热爱并购),并使用(经许可)by Mozilla 用于其实施。在这两种情况下, 都是大写的 S。这是该名称的唯一规范形式。当然,该语言的另一个名称是 ECMAScript(或 ES),但除了在谈论 ES5 时,没有人真正使用它。 【参考方案1】:

正如其他人指出的那样,需要设置 WebChromeClient 才能使alert() 工作。只需设置默认的 WebChromeClient() 就足够了:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());

感谢以下所有 cmets。包括表示您需要启用 JavaScript 的 John Smith。

【讨论】:

是的,但大多数时候你想调整 WebChromeClient 的事件,所以...... 我终于设法通过在mWebView.setWebChromeClient(new WebChromeClient());行前添加mWebView.getSettings().setJavaScriptEnabled(true);使其工作 别忘了加webview.getSettings().setJavaScriptEnabled(true);【参考方案2】:

检查this链接,最后评论,你必须使用WebChromeClient来达到你的目的。

【讨论】:

谢谢! webView.setWebChromeClient(new WebChromeClient() @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) return super.onJsAlert(view, url, message, result); ); 你的评论对我有帮助.. 就像下面 Nikhil 的回答一样。 像魅力一样工作。但是然后.... WebClient 是否比 WebChromeClient 有任何优势。 这可能是一个愚蠢的问题,但无论如何:为什么要重写一个方法只调用具有相同参数的超级方法? 别忘了加webview.getSettings().setJavaScriptEnabled(true);【参考方案3】:
webView.setWebChromeClient(new WebChromeClient() 
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) 
        return super.onJsAlert(view, url, message, result);
    
);

【讨论】:

这很好用,但是当我从 javascript 调用 prompt 时,它没有显示提示文本,而是显示“https://...的页面说:”完全打破了沉浸式嵌入在应用中的 WebView【参考方案4】:

以下代码将起作用:

private WebView mWebView;
final Activity activity = this;

// private Button b;
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient() 
        public void onProgressChanged(WebView view, int progress) 
            activity.setProgress(progress * 1000);
        
    );

    mWebView.loadUrl("file:///android_asset/raw/NewFile1.html");

【讨论】:

【参考方案5】:

你可以试试这个,它对我有用

WebView wb_previewSurvey=new WebView(this); 


       wb_previewSurvey.setWebChromeClient(new WebChromeClient() 
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) 
            //Required functionality here
            return super.onJsAlert(view, url, message, result);
        

    );

【讨论】:

【参考方案6】:

如果您希望对用户隐藏 URL,请显示如下所示的 AlertDialog。

myWebView.setWebChromeClient(new WebChromeClient() 

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) 
                Log.d(TAG, "onJsAlert url: " + url + "; message: " + message);
                AlertDialog.Builder builder = new AlertDialog.Builder(
                        mContext);
                builder.setMessage(message)
                        .setNeutralButton("OK", new OnClickListener() 
                            @Override
                            public void onClick(DialogInterface dialog, int arg1) 
                                dialog.dismiss();
                            
                        ).show();
                result.cancel();
                return true;
            
    

【讨论】:

以上是关于JavaScript 警报在 Android WebView 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 警报弹出在 IOS 中无法用于 phonegap

phonegap javascript警报不起作用?

无法在javascript反应中更改警报消息的颜色

如何在javascript中正确修改警报功能

用于位置许可警报的 Hybrid Cordova App 回调

如何在一行上制作 Javascript 警报代码