zoukankan      html  css  js  c++  java
  • 移动端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 事件在某些场景下可能会出现点击穿透的现象。

  • 相关阅读:
    UVALive 6909 Kevin's Problem 数学排列组合
    UVALive 6908 Electric Bike dp
    UVALive 6907 Body Building tarjan
    UVALive 6906 Cluster Analysis 并查集
    八月微博
    hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
    hdu 5792 World is Exploding 树状数组
    hdu 5791 Two dp
    hdu 5787 K-wolf Number 数位dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/Ann-web-1/p/11609632.html
Copyright © 2011-2022 走看看