[Violation] Added non-passive event listener to a scroll-blocking <某些> 事件. Consider marking event handler as 'passive' to make the page more responsive. See <URL> 解决办法

今天在网页控制台看到了这个警告

[Violation] Added non-passive event listener to a scroll-blocking <某些> 事件. Consider marking event handler as 'passive' to make the page more responsive. See

然后我发现是一款浏览器叫“沉浸式翻译 - 网页翻译插件 | PDF翻译 | 免费”翻译插件引起的,于是我查找了一下资料。首先这句报错的意思是,为了不影响滑动页面时的堵塞,请设置
addEventListener(type, listener,{ passive:true});

mdn文档是这样介绍passive的

  • passive 可选
    一个布尔值,设置为 true 时,表示 listener 永远不会调用 preventDefault()。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。查看使用 passive 改善滚屏性能以了解更多。

可见passive主要用来屏蔽preventDefault(),如果代码中有还会触发一个警告,可能是preventDefault,妨碍了页面滚动, 页面滚动依赖的事件有touchstart和touchmove, 这下真相大白了。

是因为touchstarttouchmove的默认行为被阻止,如果某个div上这样做了,
用户手指在上面开始滚动页面就会失败,所以从chrome 51开始对开发者建议,使用passive屏蔽touchstart和touchmove事件的preventDefault()

  const a = document.querySelector('.div')

    a.addEventListener("touchstart",(e)=>{
     
    },{
        passive:true
    })

    a.addEventListener("touchmove",(e)=>{
  
    },{
        passive:true
    })

加了passive:true后, 还有用e.preventDefault(), 控制台就会报一个错误, 这时就知道加了不该加的语句,去代码中把 e.preventDefault()删除即可

posted @ 2024-04-23 13:02  探索星空  阅读(515)  评论(0编辑  收藏  举报