webview不显示javascript windows.open()

mic*_*key 4 javascript android popup android-webview

我有一个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 ;
}
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

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

    }

}
Run Code Online (Sandbox Code Playgroud)

MyChromeClient:

private class MyChromeClient extends WebChromeClient{

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

}
Run Code Online (Sandbox Code Playgroud)

当点击其中一个指向javascript函数的链接时,所有发生的事情都是WebView灰色,而不经过shouldOverrideUrlLoading().当我点击后退键时,应用程序退出,这意味着在导航历史记录中没有放置任何内容WebView.有时没有任何事情发生,但是然后shouldOverrideUrlLoading() 运行并从Log.d()我可以看到弹出窗口的正确URL已经给予WebView.

事情是,在非常罕见的情况下,它显示很好,但我不知道如何重现它,并且它实际上显示在弹出窗口中.

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

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

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

Sam*_*ter 9

首先,您需要在以下设置上进行以下设置WebView:

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
Run Code Online (Sandbox Code Playgroud)

然后你需要附加一个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;
        }

});
Run Code Online (Sandbox Code Playgroud)

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


Dar*_*pan 1

请检查添加此 -

    getSettings().setSupportMultipleWindows(true);
Run Code Online (Sandbox Code Playgroud)