iPad模式下jquery.nicescroll.min.js报passive事件preventDefault错误
问题场景
iPad模式下运行页面时控制台抛出JS报错:
- 报错信息:
jquery.nicescroll.min.js:2054 unable to preventDefault inside passive event listener due to target being treated as passive,该报错由现代浏览器对触摸类事件监听器的passive默认规则触发 - 报错调用栈:
NiceScrollClass.cancelEvent @ jquery.nicescroll.min.js:2054self.ontouchstart @ jquery.nicescroll.min.js:1059
- 现状:已找到未压缩版
nicescroll.js的对应修复方案,但压缩版jquery.nicescroll.min.js暂未找到可行修复方法。
可行修复方案
方案1:直接修改压缩版源码的事件注册参数
压缩版代码仅做了去空格、变量名混淆处理,逻辑和未压缩版完全对应。打开jquery.nicescroll.min.js,全局搜索touchstart、touchmove关键字定位事件绑定代码段:
现代浏览器下注册touchstart/touchmove这类滚动相关事件时,如果没有显式声明passive: false,会默认将监听器标记为被动模式,此时调用preventDefault()就会抛出对应错误。
找到所有绑定触摸事件的addEventListener调用,给第三个参数显式加上passive:false配置即可,示例修改:// 修改前(压缩版常见写法) e.addEventListener("touchstart",t.ontouchstart) // 修改后 e.addEventListener("touchstart",t.ontouchstart,{passive:false})如果原代码已经传了第三个布尔值参数(控制是否在捕获阶段触发),就把参数合并为对象格式,比如原参数是
!1(即false),就替换为{capture:false,passive:false}。方案2:CSS属性兜底,无需修改JS源码
给nicescroll绑定的滚动容器添加touch-actionCSS属性,告诉浏览器该区域的触摸行为不需要执行默认滚动逻辑,就不会触发被动事件监听器的限制:/* 替换为实际页面中nicescroll挂载的容器选择器 */ .your-scroll-container { /* 完全禁用容器默认触摸行为,适合自定义滚动场景 */ touch-action: none; /* 按需配置单方向原生滚动: touch-action: pan-x; 仅允许水平方向原生滚动 touch-action: pan-y; 仅允许垂直方向原生滚动 */ }方案3:替换为已修复该问题的官方构建版本
直接替换本地旧版压缩文件为官方后续发布的、已经修复passive事件兼容问题的最新压缩构建产物即可,不需要手动修改代码。
内容的提问来源于stack exchange,提问作者karthi
相关产品推荐
相关产品推荐

