触摸和滚轮事件监听器对于跟踪用户互动和创建自定义滚动体验非常有用,但它们也可能会延迟页面滚动。目前,浏览器无法知道事件监听器是否会阻止滚动,因此它们始终在等待监听器执行完毕后再滚动页面。被动事件监听器可让您指明事件监听器绝不会阻止滚动,从而解决此问题。
浏览器兼容性
大多数浏览器都支持被动事件监听器。请参阅浏览器兼容性
Lighthouse 被动事件监听器审核如何失败
Lighthouse 标记可能会延迟页面滚动的事件监听器:
![Lighthouse 审核显示页面未使用被动事件监听器来提升滚动性能](https://developer.chrome.google.cn/static/docs/lighthouse/best-practices/uses-passive-event-listeners/image/lighthouse-audit-shows-pa-710b643918a3.png?authuser=7&hl=ro)
Lighthouse 使用以下过程来识别可能会影响滚动性能的事件监听器:
- 收集网页上的所有事件监听器。
- 过滤掉非触摸和非滚轮监听器。
- 过滤掉调用
preventDefault()
的监听器。 - 滤除与网页不同的主机上的监听器。
Lighthouse 会过滤掉来自不同主机的监听器,因为您可能无法控制这些脚本。可能存在影响您页面的滚动性能的第三方脚本,但这些脚本不会在您的 Lighthouse 报告中列出。
如何将事件监听器设置为被动状态,以提高滚动性能
向 Lighthouse 识别出的每个事件监听器添加一个 passive
标志。
如果您仅支持支持被动事件监听器的浏览器,则只需添加该标志即可。例如:
document.addEventListener('touchstart', onTouchStart, {passive: true});
如果您支持的旧版浏览器不支持被动事件监听器,则需要使用功能检测或 Polyfill。如需了解详情,请参阅 WICG 被动事件监听器说明文档的功能检测部分。