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

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

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找到这篇文章,有了详细解释。

简而言之:

由于浏览器必须要在执行事件处理函数之后,才能知道有没有掉用过 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/wennice/p/9068090.html

你可能感兴趣的文章
C4C和Outlook的集成
查看>>
人脸检测,人脸识别,机器学习库Dlib在VS2015上的详细安装教程,示例运行
查看>>
数组——冒泡排序算法
查看>>
微信H5支付坑一--手续费未结算
查看>>
Spring Cloud Alibaba发布第二个版本,Spring 发来贺电
查看>>
Netty 备录 (一)
查看>>
netfilter 五个表五个链介绍,iptables案例
查看>>
Ubuntu服务器界面认识及创建用户
查看>>
网站如何防止sql注入攻击
查看>>
【TeeChart .NET教程】(四)轴控制
查看>>
关于SBR3U30P1-7你必须知道的
查看>>
Linux防火墙-firewalled
查看>>
爬虫获取网页,出现乱码问题
查看>>
再有人问你Java内存模型是什么,就把这篇文章发给他
查看>>
控制台程序隐藏方法总结(四种)
查看>>
nginx负载均衡
查看>>
企业能源管理系统的基本要求和主要内容
查看>>
JAVA基础学习之-AQS的实现原理分析
查看>>
IT兄弟连 JavaWeb教程 监听器4
查看>>
[喵咪BELK实战(3)] logstash+filebeat搭建
查看>>