zepto的tap事件的穿透分析
首先是什么情况下会发生zepto(tap)的事件穿透:
当一个弹出层用tap点击之后这个层隐藏或者是移走,都会触发下面对应位置的点击事件(click)和一些标签的默认行为(a标签的跳转、input获取焦点)。
原因:
zepto的tap通过兼听绑定在document上的touch事件来完成tap事件的模拟的,及tap事件是冒泡到document上触发的,再点击完成时的tap事件(touchstart\touchend)需要冒泡到document上才会触发,而在冒泡到document之前,用 户手的接触屏幕(touchstart)和离开屏幕(touchend)是会触发click事件的,因为click事件有延迟触发(这就是为什么移动端不 用click而用tap的原因)(大概是300ms,为了实现safari的双击事件的设计),所以在执行完tap事件之后,弹出来的选择组件马 上就隐藏了,此时click事件还在延迟的300ms之中,当300ms到来的时候,click到的其实不是完成而是隐藏之后的下方的元素,如果正下方的 元素绑定的有click事件此时便会触发,如果没有绑定click事件的话就当没click,但是正下方的是input输入框(或者select选择框或 者单选复选框),点击默认聚焦而弹出输入键盘,也就出现了上面的点透现象。
touchstart-->touchmove-->touchend-->click
具体解决方案如下:
1) 使用github上有一个叫做fastclick的库来替代Zepto的tap事件;不过听说有坑,但是我还没有遇到过。更多信息请查看: Fastclick 导致click事件触发两次的问题
2) 监听touchend事件,并在事件中使用preventDefault()阻止冒泡(总是阻止冒泡)。
$(".js-close").on("touchend", function(e){  //这里使用touchstart事件也可以
    $('.sec_ui_dlg').remove();
    $(".dlg_bg").remove();
    e.stopPropagation();
});
3) 使用css3的pointer-events=true,pointer-events=none切换来实现;(不推荐使用)
4)  延迟一定的时间来处理事件。本人测试是超过320毫秒就不会出现穿透,与jquery的动画(fadeIn(),fadeOut())等配合,感觉良好;
$(id).fadeIn(300);(最好达到400以上)。
5)tap后延迟350ms再隐藏mask(不如使用click)
改动最小,缺点是隐藏mask变慢了,350ms还是能感觉到慢的
只需要针对mask做处理就行,改动非常小,如果要求不高的话,用这个比较省力
6)  如果还不奏效,终极解决方案是用click提代tap;
//设置点击事件为_tap
_tap = touchend in document ? "touchend":"click"  
//这样在执行的过程中就可以直接调用
div.on(_tap, function(){...})
7)下下策:直接使用click.因为会带来300ms延迟,页面内任何一个自定义交互都将增加300毫秒延迟,想想都慢
不用touch就不会存在touch之后300ms触发click的问题,如果交互性要求不高可以这么做, 强烈不推荐 ,快一点总是好的
zepto的tap事件的穿透分析的更多相关文章
- zepto之tap事件点透问题分析及解决方案
		点透现象出现的场景: 当A/B两个层上下z轴重叠,上层的A点击后消失或移开(这一点很重要),并且B元素本身有默认click事件(如a标签)或绑定了click事件.在这种情况下,点击A/B重叠的部分,就 ... 
- fastclick与zepto的 tap事件关于在手机上click事件的300ms延迟的区别
		之前翻译过一篇关于fastclick的快速点击文章http://www.cnblogs.com/lilyimage/p/3568773.html,fastclick可以解决在手机上点击事件的300ms ... 
- zepto的tap事件的点透问题的几种解决方案
		你可能碰到过在页面上创建一个弹出层,弹出层有个关闭的按钮,你点了这个按钮关闭弹出层后,这个按钮正下方的内容也会执行点击事件(或打开链接).这个被定义为这是一个“点透”现象. 以前,我也听到过tap的点 ... 
- mui和zepto的tap事件
		zepto.js和mui一起使用的时候,tap事件会发生两次,这时只要不引用zepto.js的touch.js就可以了,只用mui的tap事件转自[B5教程网]:http://www.bcty365. ... 
- webpack学习笔记——项目引入zepto及tap事件失效的解决
		先要npm下来zepto:npm install zepto 然后npm下来exports-loader和script-loader 配置如下: JavaScript // webpack.confi ... 
- 手机端 zepto tap事件穿透
		什么是事件穿透? 点击上面的一层时会触发下面一层的事件 ”google”说原因是“tap事件实际上是在冒泡到body上时才触发”,也就是Zepto的tap事件是绑定在document上的,所以会导致 ... 
- 移动端为何不使用click而模拟tap事件及解决方案
		移动端click会遇到2个问题,click会有200-300ms的延迟,同时click事件的延迟响应,会出现穿透,即点击会触发非当前层的点击事件. 为什么会存在延迟? Google开发者文档中有提到: ... 
- 移动端WEB开发,click,touch,tap事件浅析
		一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ... 
- web开发,click,touch,tap事件浅析
		一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ... 
随机推荐
- jquery操作radio单选按钮、checked复选框。
			一.radio 取值: $('input[name=radio]:checked').val(); 二.checked 判断checked是否被选中 $("input[type='check ... 
- SharePoint 使用代码为页面添加WebPart
			传统的SharePoint实施中,我们通常会创建SharePoint页面,然后添加webpartzone,而后在上面添加webpart:但是有些情况下,也要求我们使用代码,将webpart添加到相应w ... 
- Python数据结构与算法--面向对象
			前面已经讲过,Python是一种面向对象的编程语言. 面向对象编程语言中最重要的特征是允许程序员创建类建立数据模型来解决问题. 我们之前利用抽象数据类型提供的逻辑来描述数据对象 (它的状态) 和功能 ... 
- C语言中的指针和内存泄漏
			引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ... 
- iOS开发  UIWebView+JavaScript 交互总结
			算是个人项目经验的,印象比较深的Web+JS交互的使用 iOS原生应用与Web页面元素交互方式有很多,JavaScriptCore.拦截协议.第三方框架WebViewJavaScriptBridge. ... 
- App开发流程之字符串处理工具类
			记录字符串的处理,不是一个简单的工作. NSString是代码中随处可见的类型,也是应用和处理繁多的对象,在此只记录需要常备的方法,并且加以说明. #pragma mark -- [计算字符串尺寸 + ... 
- HTML5--Audio
			一.Audio标签 Web 上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件(比如 Flash)来播放的.然而,并非所有浏览器都拥有同样的插件. HTML5 规 ... 
- iOS--开发之手势解锁
			本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格 ... 
- 【转】IOS开发中图片资源使用png还是jpg格式
			对于iOS本地应用程序来说最简单的答案就是始终使用PNG,除非你有非常非常好的理由不用它. 当iOS应用构建的时候,Xcode会通过一种方式优化.png文件而不会优化其它文件格式.它优化得相当的好 他 ... 
- iOS 利用长按手势移动 Table View Cells
			本文译自:Cookbook: Moving Table View Cells with a Long Press Gesture 目录: 你需要什么? 如何做? 如何将其利用至UICollection ... 
