tap穿透之zepto的bug
一、什么是zepto tap事件穿透?
tap事件穿透就是,页面和弹框上都有绑定点击事件,最上层的弹框绑定了tap事件,下层的页面绑定了click事件,在执行完上层事件后会紧接着触发下层事件,进而出现事件穿透。
二、为什么会出现tap穿透?
因为tap和click都执行了。原理是,点击元素后,tap事件需要冒泡到document上才会触发,而在冒泡到document之前,手指接触和离开屏幕(touchstart/touchend)是会触发click事件的。因为click事件是延迟触发,所以tap事件先执行,待到300ms后,便会触发弹框下方元素的点击事件。如果正下方的元素绑定的有click事件此时便会触发,如果没有绑定click事件的话,就当没click,但是正下方的是input输入框(或者select选择框或者单选复选框)时,点击默认聚焦而弹出输入键盘,也就出现了上面的点透现象。
touchend,tap,click。
三、怎么解决tap穿透?
1、只用touch事件
这是最简单的解决方案,可以完美解决点击穿透问题。
把页面内所有click全部换成touch事件(touchstart 、touchend、tap), a标签的href也是click,需要去掉换成js控制的跳转。
2、延迟执行事件
$("#closePopup").on("tap", function (event) {
setTimeout(function(){
$('#popupLayer').hide();
$('#bgMask').hide();
},320);
});
这种方法其实很好,可以和fadeInIn/fadeOut等动画结合使用,做出过度效果。
3、fastclick
使用fastclick库,其实现思路是,取消click事件,用touchend模拟快速点击行为。
$(function() {
FastClick.attach(document.body);
});
4、只用click事件
会带来300ms延迟。
5、pointer-events
比较麻烦且有缺陷,不建议使用。
mask隐藏后,给按钮下面元素添加pointer-events: none;样式,350ms后去掉这个样式,恢复响应。缺陷是350ms内,点击元素没反应。
$('#closePopup').on('tap', function(e){
$('#popupLayer').hide();
$('#bgMask').hide();
$('#underLayer').css('pointer-events', 'none');
setTimeout(function(){
$('#underLayer').css('pointer-events', 'auto');
}, 400);
});
6、监听touchend事件,并在事件中使用preventDefault()阻止冒泡,不是所有的浏览器都支持。
$('#closePopup').on("touchend", function(e){ //这里使用touchstart事件也可以
e.preventDefault();
$('#popupLayer').hide();
$('#bgMask').hide();
});
四、Fastclick的Bug
1、事件穿透两个页面
问题描述:如果使用Fastclick解决300ms延迟问题,在安卓4.2下的webview中会引发一个比较奇怪的bug。在A页面中有个a button,在B页面中有个b button,a和b都在同一个position,给a和b都绑定一个click事件。a的click事件触发后跳转到B页面,你会发现b的click事件也被触发了???
问题分析:出现了两次click,第1次是fastclick中的模拟事件,第2次是延迟了300ms的点击事件。
解决方案:前300ms,用一个透明的div去覆盖每个页面,那么第2个click就点不到对应的button了。
2、下拉框闪退
问题描述:在iphone上,轻触select的时候,select会出现闪退。
解决方案:修改Fastclick的源码,判断点击目标的类型,如果是select,就return false。
3、日期控件无法触发
问题描述:正常点击时,无法触发日期控件,长按500ms,才可以触发。
解决方案:修改Fastclick的源码,当touchend的时候,判断点击目标的类型,如果是date,就直接return false。
FastClick.prototype.onTouchEnd = function(event) {
if(event.target.hasAttribute("type") && event.target.getAttribute("type") == "date"){
return false;
}
4、trigger触发click失效
问题描述:在iphone上,trigger("click")失效;
解决方案:修改Fastclick的源码,写个扩展。
var notNeed = FastClick.notNeeded(document.body);
$.fn.triggerFastClick=function(){
this.trigger("click");
if(!notNeed){
this.trigger("click");
}
}
需要用到模拟点击事件的时候,就使用$("#btn").triggerFastClick()来代替原来的trigger("click");
tap穿透之zepto的bug的更多相关文章
- Zepto tap 穿透bug
当两个层重叠在一起时,使用Zepto的tap事件时,点击上面的一层时会触发下面一层的事件,特别是底层如果是input框时,必“穿透”,“google”说原因是“tap事件实际上是在冒泡到body上时才 ...
- Zepto tap 穿透bug、解决移动端点击穿透问题
当两个层重叠在一起时,或是有个弹窗,使用Zepto的tap事件时,点击上面的一层时会触发下面一层的事件,特别是底层如果是input框时,必“穿 透”,“google”说原因是“tap事件实际上是在冒泡 ...
- zepto中的tap穿透
有一个项目,浮层上是有点击的按钮,但是用tap就会穿透,触发浮层下的页面的点击事件.后来问同事和经过自己尝试,发现用click就可以解决这个问题.
- 识别拖动与点击操作之zepto的bug
问题描述:给页面<a>标签绑定了tap事件,在移动设备上点击按钮貌似一切正常,可以响应.但是,把页面上下滑动几次之后,或者在滑动时手指滑动出移动屏幕之外,之后再点击按钮,就会发现第一次点击 ...
- zepto源码学习-06 touch
先上菜,看这个模块的最后一段代码,一看就明白. ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 't ...
- 深入浅出zeptojs中tap事件
1.tap事件实现 zepto 源码里面看关于tap的实现方法: $(document).ready(function(){ var now, delta, deltaX = 0, deltaY = ...
- Zepto——简化版jQuery,移动端首选js库
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826054.html 一:Zepto是什么 Zepto最初是为移动端开发的js库,是jQuery的轻量级替 ...
- 移动web基本知识
1.pixel像素基础 1.px:csspixel 逻辑像素,浏览器所使用的抽象单位 2.dp,pt:设备无关像素 3.devicePixelPatio 设备像素缩放比例 2.viewport 1. ...
- 第134天:移动web开发的一些总结(二)
1.响应式布局 开发一个页面,在所有的设备上都能够完美展示. 媒体查询:@media screen and (max-width:100px) { } 媒体类型:screen(屏幕) print(打印 ...
随机推荐
- JSP总结(三)——JSP中九大内置对象(汇总)
注:后缀为汇总的基本上是整理一些网上的. 一.九大内置对象分类: 1. request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request ...
- 使用svn进行协作开发
环境 操作系统:win7 64位 所需工具 1. 服务器端(Subversion)[Setup-Subversion-1.8.16.msi] 2. 客户端(TortoiseSVN)[TortoiseS ...
- Spark Standalone spark-default.conf
Example: spark.master spark://master:7077 spark.eventLog.enabled true spark.eventLog.dir hdfs://name ...
- 02 Redis关闭服务报错---(error) ERR Errors trying to SHUTDOWN. Check logs.
127.0.0.1:6379> shutdown (error) ERR Errors trying to SHUTDOWN. Check logs. 1.在redis.conf中修改日志文件的 ...
- 【汇编语言】Doxbox 0.74 修改窗口大小
1.打开Doxbox安装路径,找到DOXBox 0.74-2 Option.bat,双击打开. 2.找到windowresolution和output,将其值修改为下图中的值. 注意:图中,1280x ...
- SpringBoot实战——微信点餐系统
1.初始化项目 引入模块 <dependencies> <dependency> <groupId>org.springframework.boot</gro ...
- Django跨域请求
一.jsonp方式 同源策略会阻止ajaxa请求,但不阻止src. jsonp方式其实是利用了<script>标签可以直接跨域的性质,在body中生成一个<script>标签, ...
- yum安装软件报错Segmentation fault处理
yum安装软件报错Segmentation fault处理 在使用yum 更新软件时提示:Segmentation fault 中文错误提示: 段错误 [root@CMS-BAK:/usr/local ...
- js——图片懒加载
<img class="js-lazy-image centered" src="./img/dog-running.svg" width="4 ...
- 【转载】Linux启动初始化配置文件浅析(解决source /etc/profile重启后就失效?)
1)/etc/profile 登录时,会执行. 全局(公有)配置,不管是哪个用户,登录时都会读取该文件. (2)/ect/bashrc Ubuntu没有此文件,与之对应的是/ect/bash. ...