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(打印 ...
随机推荐
- txt文件按行处理工具类(可以截取小说、分析日志等)【我】
txt文件按行处理工具类(可以分析日志.截取小说等) package file; import java.io.BufferedReader; import java.io.BufferedWrite ...
- python 实现进制转换(二进制转十进制)
摘自https://baike.baidu.com/item/%E5%8D%81%E8%BF%9B%E5%88%B6%E8%BD%AC%E4%BA%8C%E8%BF%9B%E5%88%B6 pytho ...
- 数据库导出excel,前后端分离
主要参考了这篇博文:https://www.cnblogs.com/jerehedu/p/4343509.html 2.3和2.4 采用xssf,依赖:compile group: 'org.apa ...
- 强化学习Q-Learning算法详解
python风控评分卡建模和风控常识(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005214003&am ...
- DirectX11 With Windows SDK--18 使用DirectXCollision库进行碰撞检测
前言 在DirectX SDK中,碰撞检测的相关函数位于xnacollision.h中.但是现在,前面所实现的相关函数都已经转移到Windows SDK的DirectXCollision.h中,并且处 ...
- ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(记忆化搜索)
https://nanti.jisuanke.com/t/31454 题意 两个人玩游戏,最初数字为m,有n轮,每轮三个操作给出a b c,a>0表示可以让当前数字加上a,b>0表示可以让 ...
- CSS iconfont阿里巴巴矢量图库在开发中实战使用
前言 项目开发中,是避免不了使用小图标的,那么国内比较好用的图标网站当属iconfont了,下面我们将详细介绍如何使用. iconfont选择所需图标 1.iconfont官网 2.把所需要的添加进入 ...
- Groovy 设计模式 -- 享元模式
Flyweight Pattern 享元模式, 将对象的相同属性, 以节省内存为目的,存储为一份公共对象, 所有对象共用此分对象. The Flyweight Pattern is a pattern ...
- 爬取qq音乐巅峰榜---内地音乐的榜单
import requestsimport jsonimport sys for i in range(0,10): url = "https://szc.y.qq.com/v8/fcg-b ...
- MVC控制器返回一个list 视图接收
控制器 public ActionResult InfoFrame() { List<Users> list = new List<Users>(); if (Session[ ...