JavaScript警报在Android WebView中不起作用


90

在我的应用程序中,我正在使用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_width="fill_parent"
    android:layout_height="fill_parent"
/>

任何线索如何启用全JavaScriptWebView


更新资料

谢谢标记文件中
alert()方法html现在正在工作:)。

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

当我在台式机上的Firefox浏览器中执行相同操作时,效果很好。任何线索如何给多语言支持textareaWebView

2:当我单击“提交”并尝试alert()在另一个Java脚本中的方法中打开text的值时,它不起作用,这是否意味着即使WebChromeClient 仅将其适用于当前加载的html页面并且未javascripts从该页面调用,也是如此?


6
它是“ JavaScript”,而不是“ Java Script”,“ java-script”或“ Java script”(所有这些都出现在您的原始问题中)。我为你改正了。
TJ Crowder

3
@TJCrowder我敢说它应该被称为Javascript
克里斯·塞尔贝克

7
@KrisSelbekk:不。:-)“ JavaScript”是Oracle(一定喜欢并购)的注册商标,并由Mozilla(获得许可)用于实施。在两种情况下,都使用大写字母S。这是该名称的唯一规范形式。当然,该语言的另一个名称是ECMAScript(或ES),但是除了谈论ES5之外,没有人真正使用它。
TJ Crowder

Answers:


89

检查链接,以及最后评论,您必须使用它WebChromeClient来达到目的。


8
谢谢!webView.setWebChromeClient(new WebChromeClient(){@Override public boolean onJsAlert(WebView视图,字符串url,字符串消息,JsResult结果)
nurnachman 2012年

您的评论对我有所帮助。
瓦姆西·恰拉

像魅力一样工作。但是然后.... WebClient是否比WebChromeClient有任何优势。
2015年

3
这可能是一个愚蠢的问题,但无论如何:为什么要覆盖一个方法以仅使用相同的参数调用超级方法?
德米特里·安德列夫斯基

1
别忘了添加webview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov

119

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

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

感谢您下面的所有评论。包括约翰史密斯(John Smith)在内,他指出您需要启用JavaScript。


是的,但是大多数时候您想调整WebChromeClient的事件,所以...
Radu Simionescu

10
我终于mWebView.getSettings().setJavaScriptEnabled(true);在行前添加内容来使它正常工作 mWebView.setWebChromeClient(new WebChromeClient());
约翰·史密斯

2
别忘了添加webview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov

22
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }
});

这很好用,但是当我prompt从javascript 调用时,它没有显示提示文本,而是说:“ https:// ...上的页面说:”完全打破了嵌入在应用程序中的WebView的沉浸感
Michael

5

以下代码将起作用:

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");
}

0

您可以尝试一下,它对我有用

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);
        }

    });

0

如果您希望向用户隐藏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;
            }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.