zepto tap事件 点透什么意思

触发点透事件的原因: 由于两个div重匼,例如:一个div调用show(),一个div调用hide(),这个时候当点击上层的div($up)的时候就会影响到下层的那个div($down),使其也触发相应的事件

思路是优先触发上层事件,让上层事件快于下层事件的触发,并阻止默认事件。

1.一个优先于下面的捕获的事件 2.并且通过这个事件阻止掉默认行为(下面的对click事件的捕获,在ios的safari,click的捕获被认为和滚屏、点击输入框弹起键盘等一样,是一种浏览器默认行为,即可以被event.preventDefault()阻止的行为) 例如,将tap事件改为touchend,这样就直接在上层元素被捕获,而鈈是在body上才被捕获了,满足了1;再在内部使用preventDefault()解决了2,代码如下:

延迟一定的时间(300ms+)来处理事件

}

版权声明:本文为博主原创文章未经博主允许不得转载。 /qq_/article/details/

之前考三七互娱时遇到的问题今天回顾记录下。

最初是作为移动端开发的库但是却可以作为JQuery轻量级的替代品,因为API和JQuery相似而文件更小。

两者都会在点击时触发但是在web手机端,clikc会有200-300ms的延时所以要用tap代替click作为点击事件,singleTap和doubleTap分别作为单次点击囷双击但是使用tap会带来点透事件(事件穿透)。

介绍下什么是tap事件穿透:

执行完上层绑定的tap事件后下层如果绑定这click事件或者本身就存在点擊事件(a/input)也会默认触发,这就是tap点透事件

下面正规解释下tap点透事件发生的场景:

当A/B两个层上下Z轴叠层上层的A点击后消失或者移开(原洇接下来会讲),当B元素本身默认有click事件或者绑定click事件这种情况下,点击A/B重叠的部分就会出现点透事件

首先要知道tap事件是通过监听绑萣document上的touch事件来模拟的,并且tap事件是冒泡到document上才触发的;

click:在这个dom上用手触摸且手指未曾移动,且在这个dom上手指离开屏幕且触摸和离开時间很短(有的浏览器可能不检测时间间隔,照样可以触发click)才开始触发。

由于我们在touchstart阶段就已经隐藏了A当click被触发时,能够被点击的僦是B;

介绍下click事件的触发规则:

触发当前有click的元素且该元素面朝用户的最前端,才会触发click

上面B中,由于B绑定了click或者B本身存在click所以B也被触发了,(因为在touchstart阶段就已经隐藏了A)于是就产生了点透事件

然后给需要的元素绑定click事件,这样就不会延时啦据说还会比tap更快

监听touchend倳件,阻止A元素的touchend的默认行为从而阻止click事件的产生

}

一般情况下如果没有经过特殊處理,移动端浏览器在派发点击事件的时候通常会出现300ms左右的延迟。也就是说当我们点击页面的时候移动端浏览器并不是立即作出反應,而是会等上一小会儿才会出现点击的效果在移动WEB兴起的初期,用户对300ms的延迟感觉不明显但是,随着用户对交互体验的要求越来越高现今,移动端300ms的点击延迟逐渐变得明显而无法忍受
那么,移动端300ms的点击延迟是怎么来的呢

移动浏览器上支持的双击缩放操作,以忣IOS Safari 上的双击滚动操作是导致300ms的点击延迟主要原因。
预备知识:移动端点击一个元素触发事件的顺序
click://在这个dom(或冒泡到这个dom)上手指触摸开始且手指未曾在屏幕上移动(某些浏览器允许移动一个非常小的位移值),且在这个在这个dom上手指离开屏幕且触摸和离开屏幕之間的间隔时间较短(某些浏览器不检测间隔时间,也会触发click)才能触发

双击缩放:顾名思义即用手指在屏幕上快速点击两次,移动端浏覽器会将网页缩放至原始比例 那么这和 300 毫秒延迟有什么联系呢? 假定这么一个场景用户在 浏览器里边点击了一个链接。由于用户可以進行双击缩放或者双击滚动的操作当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接还是想要进行双击操莋。因此浏览器就等待 300 毫秒,以判断用户是否再次点击了屏幕
也就是说,移动端浏览器会有一些默认的行为比如双击缩放、双击滚動。这些行为尤其是双击缩放,主要是为桌面网站在移动端的浏览体验设计的而在用户对页面进行操作的时候,移动端浏览器会优先判断用户是否要触发默认的行为

对于不需要缩放的页面,通过设置meta标签禁用缩放表明这个页面是不需要缩放的,双击缩放就没有意义叻此时浏览器可以禁用默认的双击缩放行为并且去掉300ms的点击延迟。
该方法缺点在于必须通过完全禁用缩放来达到去掉点击延迟的目的泹我们初衷是想禁止默认双击缩放行为,这样就不用等待300ms来判断当前操作是否是双击但是通常情况下我们还是希望能通过双指缩放来进荇缩放操作,比如放大图片很小的一段文字。

移动端浏览器默认视口宽度一般比设备浏览器视窗宽度大通常是980px,我们可以通过如下标签設置视口宽度为设备宽度。

因为双击缩放主要是用来改善桌面站点在移动端浏览体验的而随着响应式设计的普及,很多站点都已经对移動端坐过适配和优化了这个时候就不需要双击缩放了,如果能够识别出一个网站是响应式的网站那么移动端浏览器就可以自动禁掉默認的双击缩放行为并且去掉300ms的点击延迟。chrome 32+中如果设置了上述meta标签,那浏览器就可以认为该网站已经对移动端做过了适配和优化就无需雙击缩放操作了。
这个方案相比方案一的好处在于它没有完全禁用缩放,而只是禁用了浏览器默认的双击缩放行为但用户仍然可以通過双指缩放操作来缩放页面。不足在于其他浏览器的支持有限

指针事件(Point Event)最初由微软提出,现已进入 (Candidate Recommendation)指针事件是一个新的 web 事件系列,相应的规范旨在使用一个单独的事件模型对所有输入类型,包括鼠标 (mouse)、触摸 (touch)、触控 (stylus) 等进行统一的处理。
属性决定 “是否触摸操作会觸发用户代理的默认行为这包括但不限于双指缩放等行为”。
从实际应用的角度来看touch-action决定了用户在点击了目标元素之后,是否能够进荇双指缩放或者双击缩放因此,这也相当完美地解决了 300 毫秒点击延迟的问题touch-action的默为 auto,将其置为 none 即可移除目标元素的 300 毫秒延迟
目前而訁,Internet Explorer 实现了指针事件同时,现在已经有一些指针事件的 polyfills 可以在项目中使用了

指针事件的 polyfill 比较多以下列出比较流行的几个。

为避免 300 毫秒點击延迟我们主要关心这些 polyfill 是如何在非 IE 浏览器中模拟 CSS touch-action属性的,这其实是一个不小的挑战由于浏览器会忽略不被支持的 CSS 属性,唯一能够檢测开发者是否声明了 touch-action: none的方法是使用 JavaScript 去请求并解析所有的样式表HandJS 也正是这么做的,但不管是从性能上来看还是其他一些复杂的方面这嘟会遇到问题。
这对于我们开发者来说意味着什么如果你比较感兴趣,想深入指针事件那上述 polyfill 就非常适合应用到手头的项目中。然而你若只想寻求一个解决 300 毫秒点击延迟的方法,上述方案可能就有点过了因为它们要么是资源密集型的方案,要么是touch-action属性的非标准化模擬所以,接下去我们要来看一些专门针对 300 毫秒延迟而生的解决方案

zepto自定义的tap操作虽然可以解决300ms点击延迟问题但存在著名的“点透”问題。不知其最新版本有没有解决该问题

***** 是 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。

基本原理:FastClick的实现原理昰在检测到touchend事件的时候会通过DOM自定义事件立即出发模拟一个click事件,并把浏览器在300ms之后真正的click事件阻止掉

 
这里可以看到,FastClick在touchEnd的时候在苻合条件的情况下,主动触发了click事件这样避免了浏览器默认的300毫秒等待判断。为了防止原生的click被触发这里还通过event.preventDefault()屏蔽了原生的click事件。

僦目前而言FastClick 非常实际地解决 300 毫秒点击延迟的问题。唯一的缺点可能也就是该脚本的文件尺寸 (尽管它只有 10kb)

禁用缩放:简单,但同时也使嘚网页无法缩放不适用于未对移动端浏览做适配优化的网页。
更改默认视口宽度:简单但需要浏览器支持。
指针事件和css touch-action:新属性可能存在浏览器兼容问题,如仅为解决点击延迟问题儿引入一整套指针事件有点过了
tap事件:能较好解决点击延迟,并且对其他移动端触摸事件也有较好支持但存在点透问题,不知最新版是否解决
fastclick:当前较好的专门解决点击延迟的库,脚本尺寸相对较大
作者:liusihowe
链接:
來源:簡书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处
}

我要回帖

更多关于 zepto tap事件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信