javascript - 当使用 true 调用 addEventListener() 时,removeEventListener() 不起作用

标签 javascript dom-events

我正在自学 JavaScript,遇到了一种情况,如果我在捕获阶段和冒泡阶段调用事件监听器,则删除该监听器不起作用。

function clickHandler(e, objId, num) {
  var obj = document.getElementById(objId);
  obj.innerHTML = "DIV " + num + " says " + " at X position: " + e.screenX;
}

function wrapperOne(e) {
  clickHandler(e, "heading", 1);
  e.target.removeEventListener('click', wrapperOne);
}

function wrapperTwo(e) {
  clickHandler(e, "heading", 2);
  e.target.removeEventListener('click', wrapperTwo);
}

function onloadHandler() {
  document.getElementById("div1").addEventListener('click', wrapperOne, true);
  document.getElementById("div2").addEventListener('click', wrapperTwo, true);
}

使用此代码,即使在调用 removeEventListener 函数之后,我也可以继续调用 wrapperOnewrapperTwo。如果我在 onloadHandler 的 addEventListener 中传递 false ,那么事件处理程序就会被删除。有人可以解释这两种不同的行为吗?

最佳答案

使用e.target.removeEventListener('click',wrapperOne,true);

addEventListener 和removeEventListener 的第三个参数是useCapture 参数。要支持跨浏览器,您必须在 addEventListenerremoveEventListener

上指定该 bool 值

当您在 addEventListener 中使用 false 时,removeEventListener 起作用的原因是 falseuseCapture 参数。 如果您在“捕获”阶段附加了一个事件,那么您必须告诉它从“捕获”阶段删除该事件。

参见https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener了解更多信息。

关于javascript - 当使用 true 调用 addEventListener() 时,removeEventListener() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29711276/

相关文章:

javascript - 重定向到自定义 URL 方案不起作用

javascript - 在原始 JavaScript 中加载 ajax 后将事件(使用动态数据)绑定(bind)到元素的最佳方法

javascript - 折叠卡打开然后立即再次关闭

javascript - 如何让UI线程持续运行

javascript - JQuery 语法,带 .val (""); (返回数组)

内部类对象中的 Javascript 上下文

javascript - JavaScript如何在浏览器中模拟按键控制跨域iframe?

javascript - 重构 Javascript 代码 - 需要重构

javascript - 三、二十面体几何没有顶点数组

javascript - 使用 highcharts 为条形图中的每个数据项传入 Id