jQuery同时绑定scroll和mousewheel事件,获取deltaY返回undefined如何解决
问题原因
- 事件触发逻辑问题:你同时为window绑定了
scroll和mousewheel两个事件,两类事件都会触发同一个回调函数。只有触发mousewheel事件时才会进入if分支给getDelta赋值,触发scroll事件时不会进入if分支,变量没有被赋值,自然返回undefined。 - 变量规范问题:你没有为
getDelta设置初始默认值,且var声明的变量仅提升声明不提升赋值,未进入赋值分支时变量就没有有效值。 - jQuery事件对象取值问题:jQuery封装的事件对象不会直接挂载原生事件属性,
deltaY需要到原始事件对象e.originalEvent中获取,直接取e.deltaY也可能返回无效值。 - 语法错误:原代码回调函数结束后缺少闭合的
),运行时会直接抛出语法错误。
修复方案
方案1:分开绑定事件(更清晰,推荐)
两类事件的处理逻辑本身差异较大,分开绑定避免逻辑耦合:
// 单独处理滚轮事件,获取deltaY控制滑块 $(window).on('mousewheel', function(e) { // 加可选链和空值合并兼容异常情况,默认值设为0可根据需求调整 const getDelta = e.originalEvent?.deltaY ?? 0; console.log(getDelta); // 此处写入控制滑块的逻辑 }) // 单独处理滚动事件的对应逻辑 $(window).on('scroll', function(e) { // 此处写入滚动相关的处理逻辑 })
方案2:同一回调内兼容处理
如果必须绑定到同一个回调中,先给变量设置默认值再做分支判断:
$(window).on('scroll mousewheel', function(e) { // 先初始化默认值 let getDelta = 0; if (e.type === "mousewheel") { getDelta = e.originalEvent?.deltaY ?? 0; } console.log(getDelta); // 后续逻辑可根据getDelta的值判断是滚动还是滚轮触发,做对应处理 })
内容的提问来源于stack exchange,提问作者Jandon
相关产品推荐
相关产品推荐

