Android WebView中H5页面无法触发JavaScript的alert弹窗怎么办?
各位大佬帮忙看看啊,我在Android WebView里加载H5页面,点击按钮后本该弹出alert提示框,结果完全没反应。已经检查过JavaScript是启用的,连console.log都能打出来,就是alert不显示。试过把WebView的设置里的DomStorage和Database也打开了,还是不行,是不是哪里漏掉了配置?
代码是这样设置的:webView.getSettings().setJavaScriptEnabled(true),然后加载页面没问题。按钮的onclick事件在Chrome浏览器里测试没问题,alert正常弹出。但放到APP里就死活没反应,难道Android WebView默认禁用了alert?
// 我的WebView初始化代码
webView.setWebChromeClient(new WebChromeClient() {
// 这里是不是需要重写什么方法?
});
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/index.html");
现在怀疑是不是要额外处理JavaScript对话框?但不知道具体该改哪里,网上查的资料都说设置JavaScriptEnabled就行…
关键是重写onJsAlert方法。推荐的做法是把WebChromeClient的这几个方法补全:
onJsAlert这个方法就是专门处理JS的alert调用的,不重写它的话,alert就静默消失了。同样的道理,confirm和prompt也要分别处理onJsConfirm和onJsPrompt,否则H5交互会出问题。
你之前能打console.log只能说明JS在运行,不代表所有API都可用。标准做法就是上面这样桥接JS对话框到原生Dialog,这是官方文档明确要求的实现方式。
关键点是:setJavaScriptEnabled 只是开启了 JS 执行,但 alert、confirm、prompt 这些属于“Web 页面请求系统弹窗”,需要 WebChromeClient 提供支持。
你现在的空 WebChromeClient 不会自动处理这些对话框,得补上 onJsAlert 方法。
改一下你的代码:
这样 alert 就能正常弹出来了。如果你页面里还有 confirm 或 prompt,还得顺手把 onJsConfirm 和 onJsPrompt 也实现了,逻辑类似。
CSS的话,这问题和样式当然没关系,纯属 WebView 的交互拦截没配好。很多人卡这都是因为以为开个 JS 就完事了,其实 ChromeClient 这一层才是弹窗的关键。