[Violation] Added non-passive event listener to a scroll-blocking <some> event. Consider marking eve

Vue项目 Chrome 报警告如下图:
[Violation] Added non-passive event listener to a scroll-blocking <some> event. Consider marking event handler as ‘passive’ to make the page more responsive. See <URL>

解决办法:
1.安装 default-passive-events

npm i default-passive-events -S -D

2.全局引入

import 'default-passive-events';

该警告没了
此时当我滚动鼠标滚轮放大缩小echarts地图时,新的问题出现了
直接报错 Unable to preventDefault inside passive event listener invocation.
无法阻止被动事件侦听器内部的默认调用
在这里插入图片描述
看来还是得了解其本质原理才得行: 一句话, Chrome 对e.preventDefault()的检测机制不一样了。

也就是说当用户触发我们定义的监听事件时,浏览器会主动检测我们定义的监听事件内部代码中有没有让它阻止默认事件,有就它就阻止,莫得它就继续执行,这个过程增加了我们页面渲染响应的时间,使得用户体验不好。所以呢现在Chrome51 版本以后,Chrome 增加了新的事件捕获机制-Passive Event Listeners,它会知道我们页面内的事件监听器内部是否会调用e.preventDefault()来阻止浏览器事件的默认行为,浏览器根据这个信息就能更好地做出决策来优化页面性能。当我们不设置passive的值时,passive默认为true,也就意味着该监听事件为被动监听事件,那么浏览器将不会去检测该监听事件内部有没有阻止默认行为了,直接响应用户的操作。

规则就是:
a.当属性passive赋值为true时,代表告诉了浏览器该监听事件内部不会调用e.preventDefault()来阻止默认行为(被动监听事件)

window.addEventListener("mousewheel", handler, { passive:true }); 
// 注意 passive不设值时,默认为true
// window.addEventListener("mousewheel", handler); 

此时当我们在handler函数中去e.preventDefault(),肯定就会报错了撒,你定义的时候告诉别个不会有阻止默认事件代码,然后又写个代码去阻止,浏览器只有报错了

b.当属性passive赋值为false时,就定义了该监听事件不是一个被动监听事件

现在报错的原因找到了:那就是我们在一个被动监听事件中去e.preventDefault()阻止默认事件行为,所以需要阻止浏览器默认行为时,我们应该将该监听事件设置为非被动监听事件

关于Chrome51版本集成Passive Event Listeners新特性的相关知识参考了链接: https://blog.csdn.net/dj0379/article/details/52883315

  • 20
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值