Android WebView:确定<a>目标= "_ blank"



是否可以检查用户是否点击了target="_blank"的HTML链接?

我想做的是在WebView中显示我的应用程序中的html,但在android默认浏览器中启动"外部"链接。"外部"链接对我来说是target="_blank"的链接。所有其他的链接都应该在webview中处理。

例如:用户点击我的WebView中的链接:

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

然后我想在android浏览器中打开给定的url。

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

我也试过setSupportMultipleWindows(true);结合onCreateWindow(),但是在这个回调中,我无法获得url。

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

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

我刚刚自己解决了这个问题。以下是我如何修复的。

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

你可以这样做:(难看但会工作)

在onPageFinished()中,注入一个javascript代码片段到页面中,它做的事情如下:

  1. 遍历具有target=_blank属性的所有元素
  2. 将这些元素的href改为external://[original href]

如果网站使用jquery,应该很容易。如果没有,您仍然可以使用标准的DOM Javascript。

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

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

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

最新更新