• 滑动时候警告:Unable to preventDefault inside passive event listener


    移动端Web界面滚动性能优化 Passive event listeners

    最近更新了ios11.3,项目上发现这么一个问题,“我的”页面和两个列表页的滚动出现了问题,滚动时候不仅滚动了希望滚动的部分,整体的页面也跟随者上下滚动,整个页面非常卡顿。

    1. 这两个页面都用了touch事件
    2. 控制台打印如下警告:
    [Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. 
    See https://www.chromestatus.com/features/5093566007214080
    

      

    解决办法1:

    在touch的事件监听方法上绑定第三个参数{ passive: false },
    通过传递 passive 为 false 来明确告诉浏览器:事件处理程序调用 preventDefault 来阻止默认滑动行为。

    elem.addEventListener(
      'touchstart',
      fn,
      { passive: false }
    );
    

      

    解决办法2:

    * { touch-action: pan-y; } 
     使用全局样式样式去掉
    

      

    Passive event listeners

    2016年Google I/O上提出的概念,目的是用来提升页面滑动的流畅度。

    在 Android 版 Chrome 浏览器的 touch 事件监听器的页面中,80% 的页面都不会调用 preventDefault 函数来阻止事件的默认行为。在滑动流畅度上,有 10% 的页面增加至少 100ms 的延迟,1% 的页面甚至增加 500ms 以上的延迟。

    由于浏览器无法预先知道一个事件处理函数中会不会调用 preventDefault(),它需要等到事件处理函数执行完后,才能去执行默认行为,然而事件处理函数执行是要耗时的,这样一来就会导致页面卡顿,也就是说,当浏览器等待执行事件的默认行为时,大部分情况是白等了。

    如果 Web 开发者能够提前告诉浏览器:“我不调用 preventDefault 函数来阻止事件事件行为”,那么浏览器就能快速生成事件,从而提升页面性能,Passive event listeners 的提出就解决了这样的问题。



    作者:乐雪_
    链接:https://www.jianshu.com/p/04bf173826aa
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    MySQL 5.6 中 TIMESTAMP 的变化
    NetWork
    Esper
    maven nexus linux私服搭建
    file not found app文件
    设计模式之十五:訪问者模式(Visitor Pattern)
    邻接表 几篇不错的解说
    自己定义带三角形箭头的TextView
    linux程序调试命令addr2line之入门简单介绍(本文先不聊gdb调试)
    AndroidManifest 中android:exported
  • 原文地址:https://www.cnblogs.com/1906859953Lucas/p/9692098.html
Copyright © 2020-2023  润新知