iOS中UIWebView中添加长按和双击事件
来源:互联网 发布:ubuntu iptables启用 编辑:程序博客网 时间:2024/05/01 05:46
如何在UIWebView中响应双击事件
最近做的一个项目中涉及这样一个需求: 响应用户点击html元素的事件.这其中包含响应单击(single tap/click)和双击(double tap/dblclick).
单击事件
通常单击的解决方案是用javascript实现, 为html元素绑定onclick
事件, javascript接收事件后跳转url, 在CocoaTouch中用 webView:shouldStartLoadWithReque
Javascript:
function myClick() { var e = window.event var url = "click:" + e.target.id; document.location = url;}var ele = document.getElementByIdx_x(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, 绑定了UIScrollViewDelayedTouch
和UIScrollViewPanGestureRe
这两个事件, 后者响应拖动事件, 前者相应点击事件.
尝试添给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 gestureUITapGestureRecognizer *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]; 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文档就不能接受到任何点击事件了.
- iOS中UIWebView中添加长按和双击事件
- [iOS]如何在UIWebView中响应双击事件
- DataGrid中添加单击或者双击事件
- 在DefaultTableModel中添加鼠标双击事件
- wpf中手动添加双击事件
- Flash中添加鼠标双击事件
- Android中Recyclerview使用3----添加条目得到点击事件和长按事件
- iOS 禁用UIWebView 加载 网页的长按事件
- iOS 禁用UIWebView 加载 网页的长按事件
- iOS 禁用UIWebView 加载 网页的长按事件
- iOS 禁用UIWebView 加载 网页的长按事件
- iOS 禁用UIWebView 加载 网页的长按事件
- iOS 禁用UIWebView 加载 网页的长按事件
- 禁用UIWebView中双击和手势缩放页面
- 禁用UIWebView中双击和手势缩放页面
- Android系统中自定义按键的短按、双击、长按事件
- Android系统中自定义按键的短按、双击、长按事件
- android 在onTouch中添加长按事件
- BZOJ-1621-[Usaco2008 Open]Roads Around The Farm分岔路口
- 查缺补漏
- break,continue,return in function
- 【个人记录】使APP在user版本隐藏图标,在eng版本显示图标
- 【剑指offer-Java版】30最小的K个数
- iOS中UIWebView中添加长按和双击事件
- Unity中鼠标左键按下,拖拽物体移动
- iOS重绘机制drawRect
- Java代码通过JDBC连接Hiveserver2
- 用到数组的相关java程序
- 关于类加载器的理解以及双亲委派模型
- PAT 1059. Prime Factors (25) 质因子分解
- PAT 大数运算
- Jmeter之JDBC Request使用方法(oracle)