里面含有超链接的IFRAME不工作的Andr​​oid的WebView [英] Android webview containing hyperlinks inside IFRAME not working

查看:1491
本文介绍了里面含有超链接的IFRAME不工作的Andr​​oid的WebView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在这个例子中的超链接不嵌入在Android的WebView工作时。有人可以解释为什么,我该如何改正呢?它在桌面Chrome浏览器工作正常。下面提供的示例HTML code是由一个Twitter时间轴部件产生的动态code复制。我无法控制的HTML Twitter的时间线窗口小部件创建,所以我需要一个解决此限制的解决方案。

下面是一个例子设置:

的test.html:

 < IFRAME SRC =twitter.html>< / IFRAME>

twitter.html:

 &LT; A HREF =htt​​p://t.co/zCcFf1SWtL目标=_空白级=链接媒体定制的数据 -  pre-嵌入式=真正的DIR =升&GT; pic.twitter.com/zCcFf1SWtL< / A&GT;

的Java code:

  webView.loadUrl(文件:///android_asset/test.html);

实际的Twitter时间线窗口小部件HTML:(此注入上述HTML code)

 &LT;一类=Twitter的时间表HEIGHT =355数据DNT =真HREF =htt​​ps://twitter.com/VectrenStorm数据部件-id =367009971554095104&GT;通过鸣叫@ VectrenStorm&LT; / A&GT;
!功能(D,S,ID){VAR JS,FJS = d.getElementsByTagName(S)[0],P = /^http:/.test(d.location)? HTTP:HTTPS;如果{JS = d.createElement(多个)(d.getElementById(ID)!); js.id = ID; js.src = P +://platform.twitter.com/widgets.js; fjs.parentNode.insertBefore(JS,FJS); }}(文件,脚本,Twitter的WJS);


解决方案

显然,这是Android的WebView的限制。当目标=_空白上一个IFRAME里的超链接,然后ShouldOverrideUrlLoading为不叫点击链接时。

作为一种变通方法我实现了一个新的WebChromeClient类,并覆盖了onCreateWindow方法。点击该链接时,会触发此方法;里面onCreateWindow我创建了一个新的临时网页视图,并将其分配给WebViewTransport消息,然后返回true。我还指定新的WebView WebViewClient的自定义实现。当创建新的网页视图其ShouldOverrideUrlLoading方法被​​触发。里面的ShouldOverrideUrlLoading方法我加载呼吁使用loadURL对我原先的WebView,然后破坏新的,临时的WebView。

下面是一些code(它是写在C#/单声道):

 公共类TwitterChromeClient:WebChromeClient
{
    公众覆盖布尔OnCreateWindow(的WebView视图,布尔对话框,布尔userGesture,Android.OS.Message resultMsg)
    {
        的WebView newWebView =新的WebView(view.Context);
        newWebView.SetWebViewClient(新TempWebClient(视图));
        WebView.WebViewTransport运输=(WebView.WebViewTransport)resultMsg.Obj;
        transport.WebView = newWebView;
        resultMsg.SendToTarget();
        返回true;
    }
}公共类TwitterWebClient:WebViewClient
{
    公众覆盖布尔ShouldOverrideUrlLoading(的WebView视图,字符串URL)
    {
        //不幸的是这种方法将永远不会被要求一个iframe中的链接时,目标=_空白
        返回true;
    }
}公共类TempWebClient:WebViewClient
{
    公众的WebView OriginalWebView {搞定;组; }    公共TempWebClient(的WebView originalWebView)
    {
        OriginalWebView = originalWebView;
    }    公众覆盖布尔ShouldOverrideUrlLoading(的WebView视图,字符串URL)
    {
        OriginalWebView.LoadUrl(URL);
        OriginalWebView = NULL;
        view.Destroy();
        返回true;
    }
}

The hyperlink in this example is not working when embedded in an Android WebView. Can someone explain why and how I can correct it? It works fine in the Desktop Chrome browser. The example HTML code provided below was copied from the dynamic code generated by a twitter timeline widget. I cannot control the HTML that the twitter timeline widget creates so I need a solution that works around this limitation.

Here is an example set up:

test.html:

<iframe src="twitter.html"></iframe>

twitter.html:

<a href="http://t.co/zCcFf1SWtL" target="_blank" class="link media customisable" data-pre-embedded="true" dir="ltr">pic.twitter.com/zCcFf1SWtL</a>

Java code:

webView.loadUrl("file:///android_asset/test.html");

Actual Twitter Timeline widget HTML: (this injects the above HTML code)

<a class="twitter-timeline" height="355" data-dnt="true" href="https://twitter.com/VectrenStorm" data-widget-id="367009971554095104">Tweets by @VectrenStorm</a>
!function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? 'http' : 'https'; if (!d.getElementById(id)) { js = d.createElement(s); js.id = id; js.src = p + "://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); } } (document, "script", "twitter-wjs");

解决方案

Apparently this is a limitation of the Android WebView. When target="_blank" on a hyperlink inside an IFRAME then ShouldOverrideUrlLoading is not called when the link is clicked.

As a workaround I implemented a new WebChromeClient class and overrode the onCreateWindow method. This method is triggered when the link is clicked; inside onCreateWindow I create a new temporary webview and assign it to the WebViewTransport message and then return true. I also assign the new WebView a custom implementation of WebViewClient. When the new webview is created its ShouldOverrideUrlLoading method is triggered. Inside the ShouldOverrideUrlLoading method I load call loadUrl on my original webview and then destroy the new, temporary webview.

Here's some code (it's written in C#/mono):

public class TwitterChromeClient : WebChromeClient
{
    public override bool OnCreateWindow(WebView view, bool dialog, bool userGesture, Android.OS.Message resultMsg)
    {
        WebView newWebView = new WebView(view.Context);
        newWebView.SetWebViewClient(new TempWebClient(view));
        WebView.WebViewTransport transport = (WebView.WebViewTransport)resultMsg.Obj;
        transport.WebView = newWebView;
        resultMsg.SendToTarget();
        return true;
    }
}

public class TwitterWebClient : WebViewClient
{
    public override bool ShouldOverrideUrlLoading(WebView view, string url)
    {
        //Unfortunately this method will never be called for links inside an iframe when target="_blank"
        return true;
    }
}

public class TempWebClient : WebViewClient
{
    public WebView OriginalWebView { get; set; }

    public TempWebClient(WebView originalWebView)
    {
        OriginalWebView = originalWebView;
    }

    public override bool ShouldOverrideUrlLoading(WebView view, string url)
    {
        OriginalWebView.LoadUrl(url);
        OriginalWebView = null;
        view.Destroy();
        return true;
    }
}

这篇关于里面含有超链接的IFRAME不工作的Andr​​oid的WebView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆