【问题标题】:Disable popups and alertboxes in android webview在 android webview 中禁用弹出窗口和警报框
【发布时间】:2014-06-02 00:24:22
【问题描述】:

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

我遇到了 onJsAlert() 方法,但根据 androids 文档

 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.

这不是我想要的。我想避免弹出窗口和警告框(包括提示和确认) 任何帮助将不胜感激

谢谢!

【问题讨论】:

    标签: java android html webview


    【解决方案1】:

    您可以尝试覆盖警报、确认等。也许在何时允许和何时不允许显示警报时添加一个标志。 JavaScript: Overriding alert()

    【讨论】:

    • 我正在加载的网页不在我的控制之下。我无法更改网站的代码。
    • 您可以将javascript附加到webview。 webview.loadUrl("javascript:alert('hi');")。我建议在页面加载完成后执行此操作。
    • 但这将显示警报而不是避免它。我的目标是不显示任何警报。如果我的问题很蹩脚,我很抱歉:/
    • :D alert("hi") 只是为了表明您可以在加载后将自定义 javascript 附加到 webview。我的答案中的链接提供了有关如何覆盖警报功能的 javascript,因此您可以将 alert("hi") 替换为链接中的代码。
    • 感谢我现在在页面加载的每个进度上注入 javascirpt。并且没有得到任何警报谢谢!
    【解决方案2】:

    我尝试了 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。对于 UIWebview 和 WkWebview,iOS 中是否还有类似的阻止弹出窗口的解决方案?
    • 对不起@rishabh,我不知道。我在 iOS 方面没有经验。
    • 显然如果你不使用 result.cancel(); webview.loadUrl 和其他函数开始表现得很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2012-09-26
    相关资源
    最近更新 更多