Webview:阻止JavaScript弹出窗口

时间:2017-06-25 11:31:13

标签: javascript android webview block overlays

现在我正在使用这行代码来至少尝试阻止JavaScriptwebview的弹出窗口:

webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

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

非常感谢帮助。

3 个答案:

答案 0 :(得分:5)

前导

我们处于等式的WebView 设置 一侧。
乍一看是一个明显的评论,但如果你 不需要 JavaScript 不启用 JavaScript,那么您就不会获得JavaScript弹出式广告。我假设您 DO 需要JavaScript(请记住可能 XSS vulnerable)并且想要 您可以 禁用 不可避免的跟随的弹出窗口。

<强> INFO

WebViewClient。覆盖WebView的此行为,例如所以链接在WebView内打开。 WebChromeClient可让您处理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

OP(2)让我们阻止

来自@markproxy如果您展开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);

答案 1 :(得分:1)

您可以在WebChromeClient中尝试阻止弹出窗口(窗口):

@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
    WebView newWebView = (WebView) LayoutInflater.from(view.getContext()).inflate(R.layout.webview_custom_view, null);
    WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
    transport.setWebView(newWebView);
    resultMsg.sendToTarget();
    return true;
}

对象newWebView应该添加到某个容器,如view.It从WebView创建窗口(弹出窗口)的示例。

答案 2 :(得分:1)

我必须这样做。覆盖WebChromeClient类中的onJSAlert()方法:

MyWebChromeClient myWebChromeClient = new MyWebChromeClient();
webView.setWebChromeClient(myWebChromeClient);

MyWebChromeClient 是一个自定义类,它继承 WebChromeClient

public class MyWebChromeClient extends WebChromeClient {

    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result)
    {
        final JsResult finalRes = result;
        new AlertDialog.Builder(view.getContext())
            .setMessage(message)
            .setPositiveButton(android.R.string.ok,
                    new AlertDialog.OnClickListener()
                    {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finalRes.confirm();  
                        }
                    })
            .setCancelable(false)
            .create()
            .show();
        return true;
    }
}