jQuery的off方法对应的原生JavaScript等效实现是什么?
jQuery off() 方法的原生 JavaScript 替代方案
jQuery 中不带参数的 off() 方法作用是移除匹配元素上绑定的所有事件监听,原生 removeEventListener 确实需要传入事件类型、对应回调函数等参数才能精准移除,针对你的场景可以用以下两种方案解决:
方案1:克隆节点替换(最简单快速)
直接克隆目标元素替换原有节点,通过 addEventListener 绑定的事件不会随克隆被复制,即可达到移除所有事件的效果,适用于不需要保留元素额外运行时状态的场景:
const closeAdEle = document.querySelector('.closeAd'); // 传入 true 表示深克隆,保留元素的所有子节点 closeAdEle.replaceWith(closeAdEle.cloneNode(true));
如果需要保留元素上的行内 onxxx 绑定事件,该方案也可以兼容,克隆时会完整保留行内事件属性。
方案2:绑定事件时统一存储回调,批量移除
如果你不能替换原有节点,就需要在绑定事件时统一存储所有事件的相关参数,移除时遍历存储内容调用 removeEventListener 即可:
// 绑定事件阶段 const closeAdEle = document.querySelector('.closeAd'); // 自定义属性存储所有绑定的事件信息 closeAdEle._boundEvents = closeAdEle._boundEvents || []; // 示例:绑定点击事件 const clickHandler = function() { console.log('广告关闭'); }; closeAdEle.addEventListener('click', clickHandler, false); // 存储事件信息 closeAdEle._boundEvents.push({ type: 'click', handler: clickHandler, capture: false }); // 需要移除所有事件时 closeAdEle._boundEvents.forEach(evt => { closeAdEle.removeEventListener(evt.type, evt.handler, evt.capture); }); // 清空存储 closeAdEle._boundEvents = []; // 额外移除行内绑定的onxxx事件 for (const key in closeAdEle) { if (key.startsWith('on')) { closeAdEle[key] = null; } }
注:浏览器没有提供官方API直接获取元素上所有绑定的事件监听回调,因此没有办法在不存储回调、不替换节点的前提下直接移除所有事件。
内容的提问来源于stack exchange,提问作者mistersholmes
相关产品推荐
相关产品推荐

