我尝试了接受的Kalel Wade回答中描述的方法,并通过在每个进度事件上注入JavaScript来阻止弹出窗口。然而,我发现了一种看起来更加优雅的方法。
如果你扩展WebChromeClient,就可以重写它的onJsAlert()方法并阻止内置警报处理程序。与此同时,您可能还希望阻止对confirm()和prompt()的调用:
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
result.cancel();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
result.cancel();
return true;
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
result.cancel();
return true;
}
};
webView.setWebChromeClient(webChromeClient);
考虑到您已经看到JavaScript警报,我相信您已经分配了WebChromeClient。(如果您没有这样做,则不支持警报。)因此,只需添加上述覆盖即可。
在返回之前确保调用result.cancel()。根据我的经验,如果您不这样做,JavaScript引擎似乎会挂起;按钮处于按下状态,并且不会注册任何后续交互。