手机端 click 事件 300ms 左右延迟

762 阅读1分钟

延迟原因

早期在iPhone的Safari浏览器中,为了实现双击放大效果,当用户点击屏幕时会判断在300ms内(注意:300ms是在touchend之后)是否有第二次点击,如果有就是双击,如果没就是单击,触发click事件。此过程可拆解为:touchstart->touchmove->touchend->click

解决思路

touchstart/touchend是没有延迟的,可以用touchend来模拟快速点击行为。zepto的tap或fastclick.js都是这个原理,只是zepto的tap事件统一在document的touchend时触发的。

延迟导致问题及解决方法

  • zepto tap穿透
    • 现象描述:遮罩层中有一个标签绑定tap事件,触发此事件遮罩层消失,该标签下方有一个绑定click事件的元素。当点击上层标签时,同时也触发下层元素的click事件。
    • 原因:touchend后继续等待300ms发现没有其他行为了,则继续触发click,由于这时遮罩层已经消失,所以当前click事件的target就在底层元素上。
    • 解决方法:
      • 直接将上层元素的tap事件换成click事件(会出现300ms的延迟触发事件)。
      • 可以给元素的消失做一个fade效果,类似jQuery里的fadeOut,并设置动画duration大于300ms,这样当延迟的 click 触发时,就不会“穿透”到下方的元素了。
      • 使用fastclick.js
  • H5页面click事件反映迟钝:使用fastclick.js
$(function() {
	FastClick.attach(document.body);
});

参考链接