移动端滚动卡顿时,怎么用Passive监听优化事件?
在优化移动端页面时,我给触摸事件加了{ passive: true },滚动确实流畅了,但有个问题:touchMove里调用event.preventDefault()阻止滚动时完全没反应了,这是为什么呢?
具体场景是这样的,页面里有个侧边栏拖拽组件,当手指滑动到侧边栏区域时,需要阻止页面滚动,只触发拖拽。我之前写的是:
document.addEventListener('touchmove', (event) => {
if (isDragging) event.preventDefault()
}, { passive: true })
但这样设置后拖拽失效了,控制台还报错:The 'passive' option must be used in a function with 'Capture' phase。尝试把passive: false又回到卡顿状态…
试过分开写两个事件监听,但感觉这样代码重复了,有没有更好的处理方式?
核心就是:只有非 passive 的事件才能阻止滚动,而且要在 capture 阶段提前注册。
我之前这样搞的:
确保只有需要阻止滚动的时候才在非 passive 的 listener 里处理,其他滚动交给 passive 提升性能。