Unable to preventDefault inside passive event listener due to target being treated as passive报错

问题

这几天写手机网页的时候发现浏览器一直报这个错误,但是不影响使用,可能是我有强迫症的原因吧,就算不影响正常使用,我也看不惯,就要把它消灭掉。
在使用 swiper.js jquerymobile.js 等移动端js库的时候,如果使用了滑动事件,不时就会报错:

翻译一下:chrome 监听touch类事件报错:无法被动侦听事件preventDefault,是新版本chrome浏览器报错。

preventDefault()是取消默认事件的,如果这个函数起作用,可以使 默认的表单提交不提交,a链接的点击跳转不跳转。

原因:google浏览器为了最快速的相应touch事件,做出的改变。
历史:当浏览器首先对默认的事件进行响应的时候,要检查一下是否进行了默认事件的取消。这样就在响应滑动操作之前有那么一丝丝的耽误时间。
现在:google就决定默认取消了对这个事件的检查,默认事件就取消了。直接执行滑动操作。这样就更加的顺滑了。
但是浏览器的控制台就会进行错误提醒了。

具体情况:
从 chrome56 开始,在 window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为 passive: true。浏览器忽略 preventDefault() 就可以第一时间滚动了。

导致下面的效果一致:

window.addEventListener('touchmove', func) //效果和下面一句一样
window.addEventListener('touchmove', func, { passive: true })

这样会出现新的问题:
如果在window、document 和 body 元素的 touchstart 和 touchmove 事件处理函数中调用 e.preventDefault() ,会被浏览器忽略掉,并不会阻止默认行为。

解决

怎么可以既不让控制台提示,而且 preventDefault() 有效果呢?

  • 方法一:
    应用 CSS 属性 * { touch-action: none; } 这样任何触摸事件都不会产生默认行为,但是 touch 事件照样触发。
    touch-action详情: touch-action
  • 方法二:
    注册处理函数时,用如下方式,明确声明为不是被动的{ passive: false }
    window.addEventListener(‘touchmove’, func, { passive: false })
posted @ 2020-12-16 09:20  ZerlinM  阅读(460)  评论(0编辑  收藏  举报