我正在开发一款基于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。
答案 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;
}