webview 不显示 javascript windows.open()

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9147875/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-26 05:44:03  来源:igfitidea点击:

webview don't display javascript windows.open()

javascriptandroidpopupandroid-webview

提问by mickey

I have a WebViewin which i display web content which i have no control over. The content displays fine, but have links which spawn a popup window. The javascript function that does that looks like this:

我有一个WebView我无法控制的网页内容。内容显示正常,但有产生弹出窗口的链接。执行此操作的 javascript 函数如下所示:

function getEntry(id) {
var win = window.open('', 'Booking',
'resizable=yes,scrollbars=yes,status=no,width=500,height=400');
win.document.location = '/some/url/1-' + id ;
}

I can't easily change this, and if the people responsible for the page i download would change it, i guess my app would fail miserably...

我不能轻易改变这一点,如果负责我下载的页面的人会改变它,我想我的应用程序会惨遭失败......

My WebViewsetup in the activity looks like this:

WebView在活动中的设置如下所示:

    _webview = new WebView(this);
    setContentView(_webview);

    final Activity activity = this;
    _chromeClient = new MyChromeClient();

    _webview.setWebChromeClient(_chromeClient);

    //I experimented with changing user agent, in case that would have any effect, it didn't...
    _webview.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1");

    _webview.setWebViewClient(new MyWebViewClient());
    _webview.getSettings().setJavaScriptEnabled(true);
    _webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    _webview.getSettings().setSupportZoom(true);
    _webview.getSettings().setBuiltInZoomControls(true);
    _webview.getSettings().setDomStorageEnabled(true);
    //Cache settings...
    _webview.getSettings().setAppCacheMaxSize(1024*1024*8);
    _webview.getSettings().setAppCachePath("/data/data/com.your.package.appname/cache");
    _webview.getSettings().setAllowFileAccess(true);
    _webview.getSettings().setAppCacheEnabled(true);

MyWebClient:

我的网页客户端:

private class MyWebViewClient extends WebViewClient {

    @Override
    public void onLoadResource(WebView view, String url) {
        Log.d("MyWebViewClient",url);
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        showProgressDiag();
        Log.d("MyWebViewClient","shouldOverride... : " + url);
        view.loadUrl(url);
        return true;
    }
    @Override
    public void onPageFinished(WebView view, String url){
        hideProgressDiag();
    }
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

        if(failingUrl.equals("file:///android_asset/html/error.html")){
            hideProgressDiag();
            Toast.makeText(_context, "Error! Check internet connection, or try again later...", Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(_context, failingUrl, Toast.LENGTH_SHORT).show();

            view.loadUrl("file:///android_asset/html/error.html");
        }

    }

}

MyChromeClient:

我的Chrome客户端:

private class MyChromeClient extends WebChromeClient{

    @Override
    public void onProgressChanged(WebView view, int progress) {
     Pdiag.setProgress(progress * 100);
    }

}

When clicking one of the links that points to the javascript function all that happens is that the WebViewturns grey, without going through shouldOverrideUrlLoading(). When i hit the back key the app exits, meaning that nothing was placed in the nav history of the WebView. Sometimes nothing happens, but then the shouldOverrideUrlLoading()do runand from a Log.d()i can see that the correct URL for the popup has been given to the WebView.

当单击指向 javascript 函数的链接之一时,所有发生的事情都是WebView变成灰色,而不是通过shouldOverrideUrlLoading(). 当我按下后退键时,应用程序退出,这意味着WebView. 有时什么也没有发生,但随后shouldOverrideUrlLoading()运行并从Log.d()我可以看到弹出窗口的正确 URL 已提供给 WebView。

The thing is, on very rare occasions it shows up fine, but i have no clue how to reproduce it, and wether it actually shows in a popup.

问题是,在极少数情况下它显示得很好,但我不知道如何重现它,以及它是否真的显示在弹出窗口中。

I'm lost... And quite frustrated... Thinking of watching a bad sitcom instead :(

我迷路了......而且很沮丧......想看一部糟糕的情景喜剧:(

EDIT:Actually, maybe the URL wasn't all that correct after all... In Firefox the URL ends with "X<<<<" but in my Log.d() output it ends with "X%3C%3C%3C%3C"... I'll investigate if i could change that...

编辑:实际上,也许 URL 毕竟不是那么正确......在 Firefox 中,URL 以“X<<<<”结尾,但在我的 Log.d() 输出中,它以“X%3C%3C%”结尾3C%3C”...我会调查我是否可以改变它...

EDIT 2:Nope, didn't do anything... The URL is identical to the one in Firefox...

编辑 2:不,没有做任何事情...... URL 与 Firefox 中的 URL 相同......

回答by Samuel Peter

First of all, you need to set the following settings on your WebView:

首先,您需要对您的 进行以下设置WebView

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);

Then you need to attach a WebChromeClientthat overrides onCreateWindow. Your implementation of this method can create a new web view, and display it inside a dialog:

然后你需要附加一个WebChromeClient覆盖onCreateWindow. 您对这个方法的实现可以创建一个新的 web 视图,并将它显示在一个对话框中:

webView.setWebChromeClient(new WebChromeClient() {

        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            WebView newWebView = new WebView(MyActivity.this);
            WebSettings webSettings = newWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);

            // Other configuration comes here, such as setting the WebViewClient

            final Dialog dialog = new Dialog(MyActivity.this);
            dialog.setContentView(newWebView);
            dialog.show();

            newWebView.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onCloseWindow(WebView window) {
                    dialog.dismiss();
                }
            });

            ((WebView.WebViewTransport)resultMsg.obj).setWebView(newWebView);
            resultMsg.sendToTarget();
            return true;
        }

});

Don't forget to set the new web view to the resultMsg, send it to its target and return true, as mentioned in the API documentation.

不要忘记将新的 Web 视图设置为resultMsg,将其发送到其目标并返回 true,如API 文档中所述

回答by Darpan

Please check with adding this -

请检查添加这个 -

    getSettings().setSupportMultipleWindows(true);