Android WebView:确定<a> target= &#34;_ blank&#34;</a>

时间:2013-03-12 18:10:51

标签: javascript android webview

是否可以检查用户是否点击了带有target =“_ blank”的html链接。

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

例如:用户在我的WebView中单击这样的链接:

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

然后我想在Android浏览器中打开给定的URL。

我用shouldOverrideUrlLoading()尝试了它,但此时我无法确定目标是“_blank”还是普通链接(没有目标)。

我也试过setSupportMultipleWindows(true);与onCreateWindow()结合使用, 但在这个回调中,我无法得到网址。

我无法更改显示的HTML,因此我无法使用带有addJavascriptInterface()的JavaScript Bridge

我还能做什么?还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

我自己刚刚解决了这个问题。以下是我修复它的方法。

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

答案 1 :(得分:1)

您可以执行以下操作:(丑陋但会起作用)

在onPageFinished()内部,将一个javascript代码片段注入页面,其中包含:

  1. 使用target = _blank属性
  2. 迭代所有元素
  3. 将这些元素的href更改为external:// [original href]
  4. 如果网站使用jquery,那应该很容易。如果没有,您仍然可以使用标准DOM Javascript。

    在你的shouldOverrideUrlLoading()上找到那些external:// *链接并在外部打开它们。

    要注入javascript,请执行以下操作:

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