禁用Android Webview中的弹出窗口和警报框

7

我正在使用启用了JavaScript的WebView,因为它在我的应用程序中需要全时使用。我的问题是,在加载URL时,我需要避免弹出窗口,有没有办法做到这一点?

我发现了onJsAlert()方法,但根据Android文档,

 Tell the client to display a javascript alert dialog.
 If the client returns true, WebView will assume that the client will handle the dialog.
 If the client returns false, it will continue execution.

这不是我想要的。我希望避免弹出窗口和警告框(包括提示和确认)。非常感谢您提供的任何帮助。

谢谢!

2个回答

20

我尝试了接受的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引擎似乎会挂起;按钮处于按下状态,并且不会注册任何后续交互。


谢谢@markproxy。 是否也有类似的解决方案来阻止iOS中的弹出窗口,适用于UIWebview和WkWebview? - rishabh
抱歉 @rishabh,我不知道。我在iOS方面没有经验。 - Mark McClelland
1
显然,如果您不使用result.cancel()函数,则webview.loadUrl和其他函数开始表现怪异。 - Muhammad Umar

4

您可以尝试覆盖alert、confirm等。可能需要添加一个标志,以确定何时允许弹出窗口,何时不允许。 JavaScript:覆盖alert()


我正在加载的网页不在我的控制范围内。我无法更改该网站的代码。 - user2933671
你可以将JavaScript附加到Webview上。Webview.loadUrl(“javascript:alert('hi');”)。我建议在页面加载完成后执行此操作。 - Kalel Wade
但是这样做会弹出警告而不是避免它。我的目标是不显示任何警报。如果我的问题很傻,我很抱歉 :/ - user2933671
alert("hi") 只是为了展示一下,你可以在 webview 加载完成后附加自定义的 JavaScript。我回答中提供的链接提供了如何覆盖 alert 功能的 JavaScript,所以你可以用链接中的代码替换 alert("hi")。 - Kalel Wade
3
谢谢。我现在正在每次页面加载的进度中注入JavaScript,而且没有收到任何警报。 - user2933671
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接