You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:54:02