我正在开发一个基于UIWebView的iPad应用程序:为了以最简单的方式进行解释,该应用程序显示了一个大型的交互式Webview,并且还支持自定义手势。

我需要捕获表示Web视图上单击的事件,但是仅当Web视图尚未使用这些单击时(即,它们不是滚动/缩放操作的开始,它们不是链接上的单击,不是)点击会触发一些javascript)。

UIWebView对事件非常贪婪,以我的经验,即使不使用它们,它也倾向于不传播它们。为了捕获事件,我最终将主UIWindow子类化(请参阅http://mithin.in/2009/08/26/detecting-taps-and-events-on-uiwebview-the-right-way/)。这运作良好,但问题是我无法识别我所获得的点击是否触发了Webview中的某些JavaScript。

作为附加限制,我无法控制将要在UIWebView中运行的javascript或将要显示的HTML。

因此,问题是这样的:怎样才能检测到所有并仅检测未触发UIWebView本身中任何其他动作(尤其是javascript动作)的tap事件?



如果您感到好奇,那么我正在研究的项目的源代码在GitHub上:要找到它,只需让Google指向Baker Framework。

最佳答案

使用JavaScript执行此操作。首先,在Webview完成加载后,将javascript Click处理程序附加到正文中以吸收所有未使用的点击。让它加载一个虚构的域,作为它的操作:

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

然后在您的Webview委托中,寻找尝试加载组成域并对其进行拦截的尝试。您现在可以用本机代码拦截该JavaScript Click处理程序并做出相应的反应:
- (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;
}

10-05 20:20
查看更多