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


辣瓜javascript

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

最近更新了ios11.3,项目上发现这么一个问题,“个人”页面和两个列表页的滚动出现了问题,滚动时候不只滚动了但愿滚动的部分,总体的页面也跟随者上下滚动,整个页面很是卡顿。css

  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 来阻止默认滑动行为。java

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

解决办法2:

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

Passive event listeners

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

For instance, in Chrome for Android 80% of the touch events that block scrolling never actually prevent it. 10% of these events add more than 100ms of delay to the start of scrolling, and a catastrophic delay of at least 500ms occurs in 1% of scrolls.chrome

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

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

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

做者:辣瓜 连接:https://www.jianshu.com/p/04bf173826aa 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。
相关文章
相关标签/搜索