取消捕获或冒泡阶段的事件监听器均需用 removeEventListener(),且函数引用、事件类型及 options(含 capture、passive、once 等)必须完全一致;匿名函数无法移除,须用具名函数或变量保存句柄。

在 JavaScript 中,**取消已在捕获阶段绑定的事件监听器,和取消冒泡阶段的监听器方法完全一样:必须使用 removeEventListener(),且传入的函数引用、事件类型、以及 options(尤其是 capture)必须完全一致。**
关键点:capture 选项必须匹配
如果你用 { capture: true } 绑定了监听器,那么移除时也必须显式传入相同的选项对象,否则无法成功移除。
- ✅ 正确(绑定和移除都带
capture: true):
const handler = () => console.log('captured');<br>element.addEventListener('click', handler, { capture: true });<br>// ... later<br>element.removeEventListener('click', handler, { capture: true }); // ✅ 成功移除- ❌ 错误(移除时漏掉
capture: true):
element.removeEventListener('click', handler); // ❌ 不会移除,因为默认是 false,与绑定时不匹配不能用匿名函数直接移除
如果绑定时用了匿名函数(如 () => {} 或 function() {}),就无法在后续调用 removeEventListener() —— 因为没有函数引用。
- ? 错误示例:
element.addEventListener('click', () => {}, { capture: true });<br>element.removeEventListener('click', () => {}, { capture: true }); // ❌ 两个箭头函数不是同一个引用- ✅ 正确做法:始终用具名函数或变量保存句柄
const onClick = () => { /* ... */ };<br>element.addEventListener('click', onClick, { capture: true });<br>element.removeEventListener('click', onClick, { capture: true });注意 passive 和 once 等选项也要一致
removeEventListener() 的第三个参数是完整选项对象,所有用于绑定的属性(如 passive、once、capture)都必须一模一样。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 例如,这样绑定:
element.addEventListener('touchstart', handler, { capture: true, passive: false });- 就必须这样移除:
element.removeEventListener('touchstart', handler, { capture: true, passive: false });- 哪怕只差一个
passive: truevsfalse,也会失败。
补充:检查是否移除成功?
浏览器不提供直接查询已绑定监听器的 API(出于安全和性能考虑)。调试时可借助浏览器开发者工具的「Event Listeners」面板查看当前元素上有哪些监听器(包括 capture 状态),确认是否还存在。
如果逻辑复杂,建议统一管理监听器句柄(例如存进 Map 或组件实例属性中),避免遗漏或错配。

















