博客原文地址:Claiyre的我的博客 https://claiyre.github.io/
如需转载,请在文章开头注明原文地址javascript
移动端的开发常常须要监听用户的双击行为,因此在touchend事件以后会有300ms左右的延迟,用来判断是否有双击事件。css
由于这种延迟,因此咱们在移动端一般不监听click事件。java
移动端的事件的发生顺序是这样的:touchstart---touchmove---touchend,而后大约过300ms触发click事件css3
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啦