移动端300ms延迟问题

1.300ms延迟由来

  300 毫秒延迟的主要原因是解决双击缩放(double tap to zoom)。双击缩放,顾名思义,即用手指在屏幕上快速点击两
次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。 那么这和 300 毫秒延迟有什么联系呢?
  假定这么一个场景。用户在 iOS Safari 里边点击了一个链接。由于用户可以进行双击缩放或者双击滚动的操作,当用
户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是想要进行双击操作。因此,iOS Safari
就等待300毫秒,
以判断用户是否再次点击了屏幕。鉴于iPhone的成功,其他移动浏览器都复制了 iPhone Safari 浏览器的
数约定,包括双击缩放,几乎现在所有的移动端浏览器都有这个功能。

 解决方案:
fastclick库或者使用touchstart事件代替点击事件

2.fastclick 解决300ms延迟

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

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

   fastClick的核心代码

        FastClick.prototype.onTouchEnd = function (event) {
            // 一些状态监测代码  // 从这里开始,
            if (!this.needsClick(targetElement)) {
                // 如果这不是一个需要使用原生click的元素,则屏蔽原生事件,避免触发两次click event.preventDefault();
                // 触发一次模拟的click
                this.sendClick(targetElement, event);
            }
        }

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

   通过 sendClick 模拟 click 事件:

        FastClick.prototype.sendClick = function (targetElement, event) { // 这里是一些状态检查逻辑
            // 创建一个鼠标事件 
            clickEvent = document.createEvent('MouseEvents');
            // 初始化鼠标事件为click事件 
            clickEvent.initMouseEvent(
                this.determineEventType(targetElement),
                true, true, window, 1, touch.screenX, touch.screenY, touch.clientX,
                touch.clientY, false, false, false, false, 0, null
            );
            // fastclick的内部变量,用来识别click事件是原生还是模拟 
            clickEvent.forwardedTouchEvent = true;
            // 在目标元素上触发该鼠标事件, 
            targetElement.dispatchEvent(clickEvent);
        }

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

3.通过 touchstart 和 touchend 模拟实现

   能不能直接用 touchstart 代替click呢,
   答案是不能,使用 touchstart 去代替click事件有两个不好的地方。
   第一:touchstart 是手指触摸屏幕就触发,有时候用户只是想滑动屏幕,却触发了 touchstart 事件,这不是我们想要的结果;
   第二:使用 touchstart 事件在某些场景下可能会出现点击穿透的现象。

转载于:https://www.cnblogs.com/Ann-web-1/p/11609632.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值