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(打印 ...
随机推荐
- 【洛谷P1134 阶乘问题】
[传送门] #include<bits/stdc++.h> using namespace std; int main() { ; cin>>a; ;i<=a;i++) ...
- 20175209 《Java程序设计》第二周学习总结
教材学习内容总结 二三章介绍的主要是Java中的基本知识:数据类型及转换,数据的输入输出,数组,运算符表达式,和常见的一些语句,这些都是帮助我们学习Java的基本知识,而这些知识很大一部分都和C语言相 ...
- VisualSVN服务器的本地搭建和使用
Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...
- Promise异步操作
Promise是es6中新增加的类(new Promise),目的为了管理JS中异步编程,也叫“Promise”设计模式 Promise用来解决异步问题.本身是同步的,只是用来管理异步编程的一种模式 ...
- jquery 倒计时效果
function daojishi(){ var starttime = new Date("2017-09-30 01:06:11"); //date的格式也可以写成:" ...
- Studio 5000指令IN_OUT管脚实现西门子风格
习惯了西门子博途编辑风格的同学,乍一看到Studio 5000的编辑界面,一时不适应,尤其是功能块或指令的IN和OUT管脚在一起,不好分辨,本文简单几步搞定,实现像西门子IN和OUT分左右显示风格. ...
- Anaconda+django安装问题
Anaconda使用中常遇到如下问题: 如果Anaconda不是最新版本,可在Anaconda Prompt中使用如下命令更新至最新版 conda update -n base -c defaults ...
- underscore用法大全
1._.find函数 var one = _.find(all, function (item) { return item.C_ID == selected; }); $('#C_NAME').va ...
- 在deepin 15.5中安装vs code并配置c/c++环境
原文地址:https://blog.csdn.net/DefetC/article/details/79946100 参考了以下几篇文章: https://www.zhihu.com/question ...
- day14 集合与函数
数据类型和变量总结 字符串.数字.列表.元组.字典 可变:列表,字典 不可变:修改变量的值ID变,字符串,数字,元组 访问顺序: 直接访问:数字 顺序访问:字符串,列表,元组 映射:字典 存放元素个数 ...