Javascript Android阻止网络视图导航

Javascript Android阻止网络视图导航,javascript,android,webview,Javascript,Android,Webview,我正在使用Android 5.0和WebView组件的最新更新。我尝试将远程网站(我无法修改此网站源代码)嵌入到WebView中 下面是我的代码 webView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.contains(URL_SERVLET)) { //Do n

我正在使用Android 5.0和WebView组件的最新更新。我尝试将远程网站(我无法修改此网站源代码)嵌入到WebView中

下面是我的代码

webView.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(url.contains(URL_SERVLET)) {
            //Do nothing 
            Log.d("DEBUG", "load IMAGE");
            //view.stopLoading();
        } else {
            Log.d("DEBUG", "load URL into WebView");
            view.loadUrl(url);
        }
        return true;
    }
    // Called when all page resources loaded
    public void onPageFinished(WebView view, String url) {
        webView.setVisibility(View.VISIBLE);
        splashscreenLayout.setVisibility(View.GONE);
    }
});
在网站端,我得到一个按钮,可以在弹出窗口中打开另一个url(使用javascript)。当我通过Android Webview点击它时,这个新的URL将替换Webview中的当前URL。我只想当我点击这个按钮时什么也没发生

它使用以下代码:未加载此url。但是网络视图变成了白色,就像一个空白屏幕

我试图调用stopLoading(),但没有成功

我不能调用webview.reload(),因为远程网站是用jsp编写的,其中有一个url提供(我想是动态生成)html页面。如果调用reload(),WebView将重新初始化为第一页(登录页)

我还试图保存webview状态并将其还原,但它不起作用


有没有一种方法可以“阻止”url的更改并保持webview指向第一个url而不重新加载?

有一种有点黑客的方法可以做到这一点,那就是编写一些javascript来阻止页面导航,并将其注入到webview中

javascript看起来像是发布的答案

注意:另一种不太具侵入性的方法可能是让javascript简单地禁用特定的按钮

然后,要将其注入到WebView中,您可以按照下面的示例进行操作

var location = window.document.location;

var preventNavigation = function () {
    var originalHashValue = location.hash;

    window.setTimeout(function () {
        location.hash = 'preventNavigation' + ~~ (9999 * Math.random());
        location.hash = originalHashValue;
    }, 0);
};

window.addEventListener('beforeunload', preventNavigation, false);
window.addEventListener('unload', preventNavigation, false);
WebView myWebView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = myWebView.getSettings();

webSettings.setJavaScriptEnabled(true);
webSettings.setAllowUniversalAccessFromFileURLs(true);
myWebView.setWebViewClient(new WebViewClient() {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
      return false;
   }

   @Override
   public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);

      injectScriptFile(view, "js/script.js"); // see below ...

      // test if the script was loaded
      view.loadUrl("javascript:setTimeout(test(), 500)");
   }

   private void injectScriptFile(WevView view, String scriptFile) {
      InputStream input;
      try {
         input = getAssets().open(scriptFile);
         byte[] buffer = new byte[input.available()];
         input.read(buffer);
         input.close();

         // String-ify the script byte-array using BASE64 encoding !!!
         String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
         view.loadUrl("javascript:(function() {" +
                      "var parent = document.getElementsByTagName('head').item(0);" +
                      "var script = document.createElement('script');" +
                      "script.type = 'text/javascript';" +
         // Tell the browser to BASE64-decode the string into your script !!!
                      "script.innerHTML = window.atob('" + encoded + "');" +
                      "parent.appendChild(script)" +
                      "})()");
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
});

myWebView.loadUrl("http://www.example.com");