2013-03-12 172 views
5

是否可以检查用户是否点击了具有target =“_ blank”的html链接。Android WebView:确定<a> target =“_ blank”

我想要做的是在我的应用程序在WebView中显示htlm,但在Android默认浏览器中启动“外部”链接。一个“外部”链接对我来说就是一个target =“_ blank”的链接。 所有其他链接应该在web视图中处理。

因此,例如:在我的WebView这样的链接用户点击:

<a href="http://www.google.com" target="_blank">new window</a> 

,然后我想在Android浏览器中打开指定的网址。

我试着用shouldOverrideUrlLoading(),但在这一点上,我不能确定,如果目标是“_blank”或正常的链接(没有目标)。

我也试过setSupportMultipleWindows(true);结合使用onCreateWindow(), ,但在此回调中,我无法获取网址。

我不能改变显示的HTML,所以我不能使用JavaScript桥addJavascriptInterface()

我还能做什么?任何其他想法?

+0

最后你是怎么修好的? – Sagar 2016-11-11 05:55:44

回答

1

你可以做到以下几点:(丑陋但将工作)

内onPageFinished(),注入的JavaScript代码片段插入其中确实有点像页:上的所有元素

  1. 迭代与目标= _blank属性
  2. 变化在href这些元素到外部:// [原始HREF]

如果网站使用jquery,它应该很容易。如果没有,你仍然可以使用标准的DOM Javascript来做到这一点。

on yourOverrideUrlLoading(),寻找那些external:// *链接并在外部打开它们。

为了注入的JavaScript,请执行以下操作:

webView.loadUrl("javascript:(function() { PLACE YOUR JS CODE HERE })()"); 
3

我只是解决了这个问题我自己。这是我如何解决它。

mWebView.setWebChromeClient(new WebChromeListener() { 
    @Override 
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) { 
     WebView newWebView = new WebView(view.getContext()); 
     newWebView.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       startActivity(browserIntent); 
       return true; 
      } 
     }); 
     WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; 
     transport.setWebView(newWebView); 
     resultMsg.sendToTarget(); 
     return true; 
    } 
}); 
+0

虽然这有一个问题,但是在您第一次打开这样的链接时它会打开,但下次点击不会执行任何操作(大多数的时间)。在两台设备上测试过。它在我去掉'newWebView'的时候工作,也就是在'shouldOverrideUrlLoading'方法中调用'Handler.postDelayed(xxx,200);''xxx'是一个可运行的函数,你可以在其中调用'destroy()'方法'newWebView'。 – jadkik94 2017-03-03 13:24:12

相关问题