Webview:阻止JavaScriptpopup窗口

现在我正在使用这行代码来至少尝试在webview阻止JavaScriptpopup窗口:

webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

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

非常感谢帮助。

    前言

    我们处于等式的WebView 设置端。
    乍一看一个明显的评论,但如果你不需要 JavaScript不要启用 JavaScript ,那么你就不会得到JavaScriptpopup窗口。 我假设你需要JavaScript (记住它可能是 XSS易受攻击的 )并且想要尽你所能来禁用不可避免的popup窗口。

    信息

    WebViewClient 。 覆盖WebView这种行为,例如,在WebView打开链接。 WebChromeClient允许您处理Javascript's alert()和其他function。
    OP(1) setJavaScriptCanOpenWindowsAutomatically(true) 通常 事件处理程序 之外完成时才被阻止。
    OP =原始post; 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); 

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

     @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应该像视图一样添加到某个容器中。这是从WebView创建窗口(popup窗口)的示例。

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

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

    MyWebChromeClient是一个inheritanceWebChromeClient的自定义类

     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; } }