拦截UIWebView中未使用的点击事件

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

我需要捕捉在web视图上表示单击的事件,但是只有在水龙头还没有被webview消耗的情况下(即它们不是滚动/缩放操作的开始,它们不是在链接上点击,它们不是点击触发一些JavaScript)。

UIWebView对它的事件非常贪婪,根据我的经验,即使它们没有被使用,也往往不会传播它们。 为了赶上事件,我结束了主UIWindow的子类(见http://mithin.in/2009/08/26/detecting-taps-and-events-on-uiwebview-the-right-way/ )。 这是行之有效的,但问题是我无法识别我得到的水龙头是否触发了一些JavaScript的Web视图或不。

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

所以,问题是这样的:什么样的方式来检测所有的,只有在UIWebView本身没有触发任何其他行动,特别是JavaScript行动的轻拍事件?

如果您好奇,我正在开发的项目的源代码位于GitHub上:要find它,只需要Google向您指出Baker Framework。

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