Webview:阻止JavaScript弹出窗口

c1p*_*ph4 10 javascript android block overlays webview

现在,我使用这行代码来至少试图通过阻止弹出窗口JavaScriptwebview:

webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

1)我不明白为什么我必须将其切换为"true"它正在工作
2)是否有其他技术阻止webview中的弹出窗口?

非常感谢帮助.

Jon*_*win 5

前言

我们在等式的WebView 设置端。
乍一看有一个明显的注释,但是如果您不需要 JavaScript请不要启用 JavaScript,那么您就不会JavaScript弹出窗口。我假设你DO需要JavaScript(记住它可能是 XSS脆弱)和想要做什么,你可以禁用该弹出窗口可以不可避免地随之而来。

信息

WebViewClient。覆盖您的这种行为WebView,例如在您的网站中打开链接WebViewWebChromeClient可让您处理Javascript's alert()和其他功能。
OP(1)setJavaScriptCanOpenWindowsAutomatically(true)通常阻塞完成后一个的事件处理程序
OP =原始帖子; O)

让我们设置一个senario

这就是我设置常规的方式webview

WebView webView = (WebView) this.findViewById(R.id.webView1);//CustomWebView ?

WebSettings webView_settings = webView.getSettings();

//by setting a WebClient to catch javascript's console messages :

WebChromeClient webChromeClient = new WebChromeClient() {
        public boolean onConsoleMessage(ConsoleMessage cm) {
            Log.d(TAG, cm.message() + " -- From line "
                    + cm.lineNumber() + " of "
                    + cm.sourceId() );
            return true;
        }
    });
webView_settings.setDomStorageEnabled(true);

WebViewClient webViewClient = new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            setTitle(view.getTitle());
            //do your stuff ...
            }
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("file")) 
        {
            // Keep local assets in this WebView.
             return false;
        }
      }
    });

//webView.setWebViewClient(new HelpClient(this));//
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);
webView.clearCache(true);
webView.clearHistory();
webView_settings.setJavaScriptEnabled(true);//XSS vulnerable set to false ?
webView_settings.setJavaScriptCanOpenWindowsAutomatically(true);//set to false ?
webView.loadUrl("file:///android_asset/connect.php.html");//load something
Run Code Online (Sandbox Code Playgroud)

OP(2)让我们阻止一切

From @markproxy如果您扩展WebChromeClient,则可以覆盖其onJsAlert()方法并阻止内置处理程序以发出警报。在使用它时,您可能需要阻止对confirm()and的调用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);
Run Code Online (Sandbox Code Playgroud)