[iOS]如何在UIWebView中响应双击事件
2014-11-06 16:53
344 查看
最近做的一个项目中涉及这样一个需求: 响应用户点击html元素的事件.这其中包含响应单击(single tap/click)和双击(double tap/dblclick).
通常单击的解决方案是用javascript实现, 为html元素绑定
在CocoaTouch中用
从而实现单击事件的响应, 大致的代码如下:
Javascript:
CocoaTouch:
使用与上面同样的方法为html元素添加
无法接收到double tap的第二次点击.
根据之前的现象来看, 显然双击事件在html之外就被拦截了, 要从CocoaTouch层下手才行.
系统的UIWebView中包含了一个UIScrollView, 绑定了
后者响应拖动事件, 前者相应点击事件.
尝试添给UIScrollView加
经测试,
尝试曲线救国的方式, 用UIGestureRecognizer的delegate方法获取事件:
Javascript:
CocoaTouch:
上面代码通过UIGestureRecognizer的delegate方法成功获取到点击事件, 需要说明的几点:
后面的document.elementFromPoint传递的也是UIWebView中对应的坐标, 不需要算上UIScrollView的Offset.
delegate方法中单击事件也可以被拦截到, 这样单击双击就可以在这块儿一起实现, 让代码看起来比较统一.
delegate方法返回NO会拦截事件, html文档就不能接受到任何点击事件了.
–以上–
单击事件
通常单击的解决方案是用javascript实现, 为html元素绑定onclick事件, javascript接收事件后跳转url,
在CocoaTouch中用
webView:shouldStartLoadWithRequest:navigationType:拦截url跳转,
从而实现单击事件的响应, 大致的代码如下:
Javascript:
function myClick() { var e = window.event var url = "click:" + e.target.id; document.location = url; } var ele = document.getElementById(ELEMENT_ID); ele.onclick = myClick;
CocoaTouch:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *requestString = [[request URL] absoluteString]; NSArray *components = [requestString componentsSeparatedByString:@":"]; if (components.count == 2 && [(NSString *)[components objectAtIndex:0] isEqualToString:@"click"]) { NSString *eleIdStr = (NSString *)[components objectAtIndex:1]; NSInteger eleId = [eleIdStr integerValue]; // Do something return NO; // Do not load request, just receive the event } return YES; }
双击事件
Failed 1
使用与上面同样的方法为html元素添加ondblclick来响应双击事件就无法实现, 现象为响应函数从不被调用. 用
setTimeout等方法尝试用单击事件来模拟双击事件也无法实现,
无法接收到double tap的第二次点击.
Failed 2
根据之前的现象来看, 显然双击事件在html之外就被拦截了, 要从CocoaTouch层下手才行.系统的UIWebView中包含了一个UIScrollView, 绑定了
UIScrollViewDelayedTouchesBeganGestureRecognizer和
UIScrollViewPanGestureRecognizer这两个事件,
后者响应拖动事件, 前者相应点击事件.
尝试添给UIScrollView加
UITapGestureRecognizer:
UITapGestureRecognizer *dblTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fakeTapGestureHandler:)];
经测试,
fakeTapGestureHandler:从未被调用过.
Success
尝试曲线救国的方式, 用UIGestureRecognizer的delegate方法获取事件:Javascript:
function eleIdFromPoint(x, y) { var ele = document.elementFromPoint(x, y) return "" + ele.id; }
CocoaTouch:
// Add gesture UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fakeTapGestureHandler:)]; [tapGestureRecognizer setDelegate:self]; [_webView.scrollView addGestureRecognizer:tapGestureRecognizer]; // Delegate - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { CGPoint tapPoint = [touch locationInView:_webView]; NSString *script = [NSString stringWithFormat:@"eleIdFromPoint(%f, %f)", tapPoint.x, tapPoint.y]; aca2 NSString *eleIdStr = [self stringByEvaluatingJavaScriptFromString:script]; if (touch.tapCount == 2) { if (eleIdStr.length > 0) { NSInteger eleId = [eleIdStr integerValue]; // Do somthing } } return YES; // Return NO to prevent html document from receiving the touch event. }
上面代码通过UIGestureRecognizer的delegate方法成功获取到点击事件, 需要说明的几点:
locationInView:的参数为
UIWebView,
后面的document.elementFromPoint传递的也是UIWebView中对应的坐标, 不需要算上UIScrollView的Offset.
delegate方法中单击事件也可以被拦截到, 这样单击双击就可以在这块儿一起实现, 让代码看起来比较统一.
delegate方法返回NO会拦截事件, html文档就不能接受到任何点击事件了.
–以上–
相关文章推荐
- 文件关联后vb.net 软件如何响应被关联文件的双击事件
- ios 动画中如何正确响应button的各种事件
- iOS 响应点击(单击或双击)scrollview空白处事件 使用NSNotification
- ios中控件同时响应单击和双击事件以及多击事件
- iOS touch事件单击双击区分响应
- iOS UIWebView 拦截点击事件(双击缩放)
- 如何响应TListView列标题的双击事件
- iOS中UIWebView中添加长按和双击事件
- 【iOS开发】如何给字符串添加超连接(响应事件)
- ios button超出父视图如何响应事件
- iOS如何给没有点击事件的View添加响应操作
- ios 中UIScrollView如何同时响应scrollViewDidScroll 与 touchesMoved等事件
- 如何使UIWebView响应Touch事件
- 自定义不规则窗口如何响应左双击事件
- iOS touch事件区分单击双击响应的方法
- asp.net如何在页面加载时响应回车事件
- asp.net如何在页面加载时响应回车事件
- 如何在线程中创建可以响应事件的窗体
- 如何自己添加后台事件(Gridview双击事件)