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(打印 ...
随机推荐
- CF765F Souvenirs
CF765F Souvenirs [CF765F]Souvenirs 主席树 - CQzhangyu - 博客园 其实不用主席树 感觉像是离线问题 但是不能支持差分.分治又处理不了 考虑按照右端点排序 ...
- gprof性能测试工具
1.编译时加-pg选项,例如:gcc -pg test.c-o test_gprof.其中test后的_gprof一定要加上.会生成gmon.out. 2.运行程序.gprof test_gprof ...
- spring-boot-devtools在Idea中热部署方法
1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency> <groupId>org.sprin ...
- LeetCode刷题(Java)
第一题 class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = ...
- Python读写文件的几种方式
一.pandas pandas模块是数据分析的大杀器,它使得对于文件相关的操作变得简单. 看一下它的简单使用 import pandas as pd # 读取 df = pd.read_csv('al ...
- RMQ(ST表)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int N, M, ...
- LATEX简易教程
1.LaTeX软件的安装和使用方法A(自助):在MikTeX的官网下载免费的MikTeX编译包并安装.下载WinEdt(收费)或TexMaker(免费)等编辑界面软件并安装.方法B(打包):在ctex ...
- day 17 - 2 递归函数练习
1.斐波那契 问第n个斐波那契数是多少 #这个效率是低的,最好不要使用双递归 def fib(n): if n == 1 or n == 2: return 1 return fib(n-1) + ...
- jdk生成https证书
最近由于客户现场做“等保”,其中有一条要求我们必须使用https进行web端的请求,之前我们一直沿用的是默认的http请求,用户说不安全,唉~~局域网,一直强调安全,安全,话不多说了 我采用的使用JA ...
- zTree动态初始化树形结构加载
zTree动态加载初始化,纠结了一小下.最终还是做出来了.注意动态获取数据在前,初始化树形结构放在成功的回调函数中,并放在$(document).ready(function () {})中: $(d ...