聊聊click延迟和点击穿透

博客原文地址:Claiyre的我的博客 https://claiyre.github.io/
如需转载,请在文章开头注明原文地址javascript

移动端click事件被延迟

移动端的开发常常须要监听用户的双击行为,因此在touchend事件以后会有300ms左右的延迟,用来判断是否有双击事件。css

由于这种延迟,因此咱们在移动端一般不监听click事件。java

移动端的事件的发生顺序是这样的:touchstart---touchmove---touchend,而后大约过300ms触发click事件css3

tap事件

zepto这个库解决click延迟的思路是:自定义tap事件,当用户点击元素时,touchend事件会先于click发生,当touchend冒泡到document时触发目标元素的tap事件
因此咱们能够经过监听tap事件代替监听click事件。
但须要注意的是,tap事件并非git

点击穿透

在咱们常见的弹出层这种状况下,点击关闭弹出层时可能会发生穿透现象。
那为何会出现点击穿透这种现象呢github

由于当tap事件发生时,上层遮罩层关闭,此时事件只进行到了touchend,而click大约在300ms后才触发,当click触发时,上面的遮罩层已经消失,这就至关于点击了到了下层的元素segmentfault

若是这个元素绑定了click事件,或者有默认的点击行为,好比a标签和input等等,那么就会触发他们的click行为。
这就是点击穿透事件。wordpress

如何解决点击穿透

1.直接将上层的tap事件换成click
代价就是有300ms的延迟,但毕竟这个按钮用户也就关闭时点一下,因此影响不大函数

2.在click事件发生前阻止它
具体作法是在touchend的事件处理函数中使用e.preventDefault()来阻止后续的click事件。事件

3.使用css3的一个新特性:pointer-events
pointer-events:none 能够完全屏蔽鼠标事件,因此能够给点击按钮这个属性,而后就能够放心大胆地使用tap事件或者touchend啦

参考文章:

  1. http://www.zhangxinxu.com/wordpress/2011/12/css3-pointer-events-none-javascript/

  2. http://www.javashuo.com/article/p-amypmlne-db.html
  3. https://github.com/mattt/MsgPackSerialization/wiki/%E7%A7%BB%E5%8A%A8%E7%AB%AFclick%E5%BB%B6%E8%BF%9F%E5%8F%8Azepto%E7%9A%84%E7%A9%BF%E9%80%8F%E7%8E%B0%E8%B1%A1

相关文章
相关标签/搜索