专栏首页yaphetsfangUnable to preventDefault inside passive event listener

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法

    这两天自己在写一个手机网页,用到了触屏滑动的特效,就是往右滑动的时候左侧隐藏的菜单从左边划出来。

    yaphetsfang
  • ef oracle参数化问题

    这个时候创建 DbParameter 列表时如果只有两个参数,程序就会报”并非所有变量都已绑定“的错误

    yaphetsfang
  • ManualResetEvent

    ManualResetEvent是C#中一个比较常用的工具,可用于线程间通信,实现一种类似信号量的功能(不知道我这样描述是否恰当,有可能不是“类似”,而“就是”...

    yaphetsfang
  • 读Zepto源码之Touch模块

    大家都知道,因为历史原因,移动端上的点击事件会有 300ms 左右的延迟,Zepto 的 touch 模块解决的就是移动端点击延迟的问题,同时也提供了滑动的 s...

    对角另一面
  • 探索c#之Async、Await剖析

    蘑菇先生
  • 不经意间又发现了一个有趣又炫酷的包~

    算起来有四五天没有更新公众号了,说好的日更呢(~—~) 小伙伴儿们竟然都没有取关,真的好感动,今天正式回归,以后可能不会更新的那么频繁了,但是…… 内容的质量一...

    数据小磨坊
  • 声学传感器能诊断机器的健康状况吗?

    小缺陷可能会在工厂机器中造成巨大故障,同时增加能耗并减少利润。声学传感器可以在此类问题失控之前诊断机器的健康状况。

    用户4122690
  • 100 Days of SwiftUI —— Day 78:Time for MapKit

    昨天您构建了一个新应用,该应用可以从用户库中导入照片,并希望您对最终产品感到满意——或至少在最终产品方面取得了很大进展。

    韦弦zhy
  • 小程序目录结构

            第一篇微信小程序的博文,不知从何开始说;name就从最基础的目录结构来说吧,初次接触这个东西自己也是折腾挺久的,这里系统的对比一下web开发的文...

    十月梦想
  • 哈佛新研究登上Science封面:这个机械外骨骼,是一条“轻功”短裤

    这是一款“神奇”的设备,能像穿短裤(方便)一样穿在身上(简洁),不仅能帮你跑步,也能帮你走路,上坡下坡也没问题(适用场景多)。

    量子位

扫码关注云+社区

领取腾讯云代金券