滑动时候警告:Unable to preventDefault inside passive event listener

更新ios11.3后,项目中“我的”页面和两个列表页滚动卡顿,这两个页面使用了touch事件。文中给出两种解决办法:一是在touch事件监听方法绑定{ passive: false };二是使用Passive event listeners,它能让开发者提前告知浏览器不阻止事件行为,提升页面性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动端Web界面滚动性能优化 Passive event listeners

最近更新了ios11.3,项目上发现这么一个问题,“我的”页面和两个列表页的滚动出现了问题,滚动时候不仅滚动了希望滚动的部分,整体的页面也跟随者上下滚动,整个页面非常卡顿。

  1. 这两个页面都用了touch事件
  2. 控制台打印如下警告:
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. 
See https://www.chromestatus.com/features/5093566007214080

解决办法1:

在touch的事件监听方法上绑定第三个参数{ passive: false },
通过传递 passive 为 false 来明确告诉浏览器:事件处理程序调用 preventDefault 来阻止默认滑动行为。

elem.addEventListener(
  'touchstart',
  fn,
  { passive: false }
);

解决办法2:

 * { touch-action: pan-y; } 
 使用全局样式样式去掉

Passive event listeners

2016年Google I/O上提出的概念,目的是用来提升页面滑动的流畅度。

For instance, in Chrome for Android 80% of the touch events that block scrolling never actually prevent it. 10% of these events add more than 100ms of delay to the start of scrolling, and a catastrophic delay of at least 500ms occurs in 1% of scrolls.

在 Android 版 Chrome 浏览器的 touch 事件监听器的页面中,80% 的页面都不会调用 preventDefault 函数来阻止事件的默认行为。在滑动流畅度上,有 10% 的页面增加至少 100ms 的延迟,1% 的页面甚至增加 500ms 以上的延迟。

由于浏览器无法预先知道一个事件处理函数中会不会调用 preventDefault(),它需要等到事件处理函数执行完后,才能去执行默认行为,然而事件处理函数执行是要耗时的,这样一来就会导致页面卡顿,也就是说,当浏览器等待执行事件的默认行为时,大部分情况是白等了。

如果 Web 开发者能够提前告诉浏览器:“我不调用 preventDefault 函数来阻止事件事件行为”,那么浏览器就能快速生成事件,从而提升页面性能,Passive event listeners 的提出就解决了这样的问题。

转载地址:https://www.jianshu.com/p/04bf173826aa

 

### 解决 Swiper.js 中被动事件监听器无法阻止默认行为的错误 当遇到 `Unable to preventDefault inside passive event listener` 错误时,这通常是因为浏览器为了提高滚动性能,默认将触摸事件设置为被动模式。这意味着这些事件处理函数中的 `preventDefault()` 调用会被忽略。 对于 Swiper.js 插件而言,可以通过修改其初始化配置来解决这个问题: #### 修改事件监听选项 确保在创建 Swiper 实例之前或者过程中,所有的触控事件都绑定了 `{passive: false}` 参数作为第三个参数[^1]。这样做可以让开发者明确告知浏览器该事件处理器可能会调用 `preventDefault()` 方法以防止页面上的某些默认操作(比如滚动)。具体实现方式如下所示: ```javascript // 假设已经包含了必要的 Swiper 库文件 var mySwiper = new Swiper('.swiper-container', { // 配置项... }); // 或者直接针对特定元素手动添加带有非被动属性的监听器 document.querySelector('.swiper-container').addEventListener( 'touchstart', function(event){ console.log('Touch start'); }, { passive: false } ); ``` #### 更新 Swiper 版本 如果上述方法仍然不起作用,则可能是由于所使用的 Swiper 版本较旧而未支持此功能。建议升级到最新版本的 Swiper,因为新版本可能已修复与此有关的问题,并提供了更好的兼容性和稳定性[^2]。 #### 微信小程序特殊注意事项 值得注意的是,在微信小程序环境中使用 Swiper 组件时也有可能会碰到类似的警告信息。这是因为小程序内部实现了自己的 DOM 结构和事件机制,因此即使按照标准网页开发的方式设置了 `{passive:false}`, 可能也无法完全消除此类提示。此时应该考虑调整业务逻辑设计,避免依赖于取消冒泡或阻止默认动作的行为[^3]。 通过以上措施应当能够有效缓解甚至彻底解决问题。不过需要注意的是,更改事件监听器的状态会对应用的整体表现造成影响,所以在实际项目中应谨慎评估利弊后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值