拦截UIWebView中未使用的tap事件

时间:2011-01-04 18:38:22

标签: cocoa-touch ipad ios uiwebview touch

我正在开发一款基于UIWebView的iPad应用程序:以最简单的方式解释它,该应用程序显示了一个大的交互式webview,此外它还支持自定义手势。

我需要捕获代表webview上单个点击的事件,但只有当webview尚未使用点击时(即它们不是滚动/缩放操作的开头,它们不是点击链接,它们不是触发一些javascript的水龙头。)

UIWebView对其事件非常贪婪,根据我的经验,它往往不会传播它们,即使它们没有被消耗。为了捕获事件,我最终继承了主UIWindow(参见http://mithin.in/2009/08/26/detecting-taps-and-events-on-uiwebview-the-right-way/)。这很好用,但问题是我无法识别我得到的水龙头是否在网页浏览中触发了一些javascript。

作为一个额外的限制,我无法控制将在UIWebView中运行的javascript或将要显示的HTML。

所以,问题是这样的:什么是一种方法来检测所有只有在UIWebView本身没有触发任何其他动作的点击事件,尤其是javascript动作?

如果您感到好奇,我正在处理的项目的源代码是在GitHub上:找到它,只要求Google指向Baker Framework。

1 个答案:

答案 0 :(得分:4)

使用JavaScript执行此操作。首先,在webview完成加载后,将javascript单击处理程序附加到正文以吸收任何未使用的点击。让它按照动作加载一个虚构的域:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *script = @"document.body.onclick = function () { document.location.href = 'http://clickhandler'; }"
    [webView stringByEvaluatingJavaScriptFromString:script];
}

然后在您的webview委托中,查看是否尝试加载构成域并拦截它们。您现在可以使用本机代码拦截javascript单击处理程序并做出相应的反应:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([request.URL.host isEqualToString:@"clickhandler"])
    {
        //handle click
        //your logic here
        return NO;
    }
    return YES;
}