Unable to preventDefault inside passive event listener

近来做项目经常在 chrome 的控制台看到以下提醒:

Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080

因而 Google 了一番,找到这篇文章,有了细致诠释。Making touch scrolling fast by default

简而言之:

因为浏览器必需要在实行事宜处置惩罚函数以后,才晓得有无掉用过 preventDefault() ,这就致使了浏览器不能实时相应转动,略有耽误。

所以为了让页面转动的结果如丝般顺滑,从 chrome56 最先,在 window、document 和 body 上注册的 touchstart 和 touchmove 事宜处置惩罚函数,会默许为是 passive: true。浏览器疏忽 preventDefault() 就能够第一时间转动了。

举例:
wnidow.addEventListener('touchmove', func) 结果和下面一句一样
wnidow.addEventListener('touchmove', func, { passive: true })

这就致使了一个题目:

如果在以上这 3 个元素的 touchstart 和 touchmove 事宜处置惩罚函数中挪用 e.preventDefault() ,会被浏览器疏忽掉,并不会阻挠默许行动。

测试:

body {
  margin: 0;
  height: 2000px;
  background: linear-gradient(to bottom, red, green);
}

// 在 chrome56 中,还是转动,而且控制台会有提醒,blablabla
window.addEventListener('touchmove', e => e.preventDefault())

那末怎样处理这个题目呢?不让控制台提醒,而且 preventDefault() 有结果呢?
两个计划:
1、注册处置惩罚函数时,用以下体式格局,明白声明为不是被动的
window.addEventListener(‘touchmove’, func, { passive: false })

2、运用 CSS 属性 touch-action: none; 如许任何触摸事宜都不会发生默许行动,然则 touch 事宜还是触发。
touch-action 另有许多选项,细致请参考touch-action

[注]将来能够一切的元素的 touchstart touchmove 事宜处置惩罚函数都邑默许为 passive: true

    原文作者:syaka
    原文地址: https://segmentfault.com/a/1190000008512184
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞