博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unable to preventDefault inside passive event listener
阅读量:6961 次
发布时间:2019-06-27

本文共 1192 字,大约阅读时间需要 3 分钟。

最近做项目经常在 chrome 的控制台看到如下提示:

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

于是 Google 了一番,找到这篇文章,有了详细解释。

简而言之:

由于浏览器必须要在执行事件处理函数之后,才能知道有没有掉用过 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 还有很多选项,详细请参考

[注]未来可能所有的元素的 touchstart touchmove 事件处理函数都会默认为 passive: true

转载于:https://www.cnblogs.com/ecmasea/p/9437660.html

你可能感兴趣的文章
http connetion test
查看>>
求助,如何获得datagrid上级的tab panel
查看>>
微信小程序页面跳转导航wx.navigateTo和wx.redirectTo
查看>>
Lua math库
查看>>
CentOS Linux系统安全设置
查看>>
Android统计图集合源码
查看>>
Android Widget 电池插件的开发实现 带源码
查看>>
自定义NavgationBar返回按钮
查看>>
我的友情链接
查看>>
日期转换练习
查看>>
Quartz 框架快速入门
查看>>
Memory Notification: Library Cache Object loaded into SGA
查看>>
linux initrd详解
查看>>
有关jqGrid应用里的字体大小不能控制的问题
查看>>
配置Tomcat连接池
查看>>
weblogic 配置连接过滤器设置ip黑白名单
查看>>
卸载了osc手机端,专心写博客
查看>>
kettle demo5 遍历目录下多文件,根据文件类型走不同方式导入到数据库
查看>>
我的友情链接
查看>>
win2008 防火墙 ipsec策略 路由和远程访问nat映射
查看>>