веб-просмотр не отображать javascript windows.open () - PullRequest
4 голосов
/ 05 февраля 2012

У меня есть 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 ;
}

Я не могу легко изменить это, и если люди, ответственные за страницу, которую я загружаю, изменит ее, я думаю, что мое приложение с треском провалится ....

Моя 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(10248);
    _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:

private class MyChromeClient extends WebChromeClient{

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

}

При нажатии на одну из ссылок, которая указывает на функцию javascript, все, что происходит, это то, что WebView становится серым, не проходя через shouldOverrideUrlLoading().Когда я нажимаю клавишу «Назад», приложение закрывается, это означает, что в истории навигации WebView ничего не было помещено.Иногда ничего не происходит, но тогда shouldOverrideUrlLoading() запускается и из Log.d() я могу видеть, что правильный URL-адрес для всплывающего окна задан WebView. *1024*

Дело в том,в очень редких случаях это проявляется нормально, но я понятия не имею, как воспроизвести его, и действительно ли это отображается во всплывающем окне.

Я потерян ... И довольно разочарован ... Думая овместо этого смотрю плохой комедийный сериал: (*

РЕДАКТИРОВАТЬ: На самом деле, возможно, URL-адрес был не совсем корректным ... В Firefox URL-адрес заканчивается на "X <<<<"но в моем выводе Log.d () он заканчивается "X% 3C% 3C% 3C% 3C" ... Я выясню, могу ли я это изменить ... </p>

РЕДАКТИРОВАТЬ 2: Нет, ничего не делал ... URL идентичен URL в Firefox ...

Ответы [ 2 ]

6 голосов
/ 01 мая 2017

Прежде всего, вам необходимо установить следующие настройки на вашем WebView:

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

Затем вам нужно прикрепить WebChromeClient, который переопределяет onCreateWindow.Ваша реализация этого метода может создать новое веб-представление и отобразить его в диалоговом окне:

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

});

Не забудьте установить новое веб-представление на resultMsg, отправить его своей цели ивернуть true, как указано в документации API .

1 голос
/ 31 мая 2013

Пожалуйста, проверьте с добавлением этого -

    getSettings().setSupportMultipleWindows(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...