为什么给 scroll 事件加 passive: true 后 preventDefault 不生效了?
我在做一个自定义下拉刷新功能,需要监听 scroll 事件并阻止默认滚动,但加上 passive: true 后 preventDefault() 就报错了,说不能在 passive 事件里调用。可不加又会有性能警告,这咋办?
这是我的监听代码:
window.addEventListener('scroll', function(e) {
if (scrollTop < 0) {
e.preventDefault(); // 这里报错:Unable to preventDefault inside passive event listener
// 自定义下拉逻辑...
}
}, { passive: true });
解决方案是用两个监听器,一个 passive 的用来检测位置,另一个非 passive 的来阻止默认行为。直接上代码:
其实这种下拉刷新最好用 touch 事件做,滚动事件坑太多了。不过你要非用 scroll 的话,上面这招能解决问题。