【问题标题】:Android WebView: Determine <a> target= "_ blank"Android WebView:确定 <a> target="_blank"
【发布时间】:2013-02-28 10:02:01
【问题描述】:

是否可以检查用户是否点击了带有 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(), 但在这个回调中我无法获取 url。

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

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

【问题讨论】:

  • 你最后是怎么修好的?

标签: javascript android webview


【解决方案1】:

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

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

【讨论】:

  • 这有一个问题,当你第一次打开这样的链接时,它会很好地打开,但接下来的点击不会做任何事情(大部分时间)。在两台设备上进行了测试。当我破坏newWebView 时它起作用了,即在shouldOverrideUrlLoading 方法中,调用Handler.postDelayed(xxx, 200); 其中xxx 是一个可运行的,您可以在其中调用destroy() 上的destroy() 方法@。
  • 我没有遇到 jadkik94 所述的问题,但我遇到的是我的应用在第一次点击时打开浏览器的速度非常慢(大约需要 2 秒),但在那之后它立即打开。
  • 这段代码如何识别我的 URL 包含属性 target=_blank ?
【解决方案2】:

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

在 onPageFinished() 中,将一个 javascript 代码片段注入到页面中,它执行以下操作:

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

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

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

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

webView.loadUrl("javascript:(function() { PLACE YOUR JS CODE HERE })()");
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 2021-12-17
  • 2012-07-13
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多