如何在UIWebView中可靠地检测链接点击?

zou*_*oul 9 uiwebview ios

我有一个UIWebView,当用户点击链接时我需要做一些事情.有一个委托回调,可用于检测水龙头:

- (BOOL) webView: (UIWebView*) webView
    shouldStartLoadWithRequest: (NSURLRequest*) request
    navigationType: (UIWebViewNavigationType) navigationType
{
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        …
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是此代码不处理所有链接点击.例如,一个普通的Google搜索结果页面对链接做了一些奇怪的事情:

<a href="http://example.com/" class="l" onmousedown="return rwt(…)">
    <em>Link Text</em>
</a>
Run Code Online (Sandbox Code Playgroud)

rwt功能导致链接UIWebViewNavigationTypeLinkClicked在点击时不触发事件.有没有办法可靠地检测落入"导航到其他页面"存储桶的所有事件?

zou*_*oul 6

到目前为止,我已经达到了以下解决方案.首先,我在加载时将一些JS代码注入页面:

function reportBackToObjectiveC(string)
{
    var iframe = document.createElement("iframe");
    iframe.setAttribute("src", "callback://" + string);
    document.documentElement.appendChild(iframe);
    iframe.parentNode.removeChild(iframe);
    iframe = null;
}

var links = document.getElementsByTagName("a");
for (var i=0; i<links.length; i++) {
    links[i].addEventListener("click", function() {
        reportBackToObjectiveC("link-clicked");
    }, true);
}
Run Code Online (Sandbox Code Playgroud)

当用户点击链接时,由于webView:shouldStartLoadWithRequest: navigationType:委托调用,我提前知道了:

if ([[[request URL] scheme] isEqualToString:@"callback"]) {
    [self setNavigationLeavingCurrentPage:YES];
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

然后,如果另一个请求出现并且_navigationLeavingCurrentPage为真,我知道用户已经点击了链接,即使导航类型标志是UIWebViewNavigationTypeOther.我仍然需要广泛地测试解决方案,因为我担心它会导致一些误报.