javascript - 为什么不能删除兄弟节点上的事件监听器?

标签 javascript html event-listener

function show1() {
  console.log("ok1");
  document.getElementById("a2").removeEventListener("click", delegate);
}

function show2() {
  console.log("ok2");
}

function show3() {
  console.log("ok3");
}

function delegate(event) {
  var flag = event.target;
  switch (flag.id) {
    case "a1":
      show1();
      break;
    case "a2":
      show2();
      break;
    case "a3":
      show3();
      break;
  }
}

ob = document.getElementById("tl");
ob.addEventListener("click", delegate);
<ul id="tl">
  <li id="a1">a1</li>
  <li id="a2">a2</li>
  <li id="a3">a3</li>
</ul>

父节点ul包含三个子节点li,在父节点上绑定(bind)一个事件监听器,让ul委托(delegate)所有节点的事件监听.
我的期望:
当您点击 a1 时,show1 函数将删除其 id 为 a2 的同级函数上的事件监听器。
也就是说,你点击id为a1li后,点击id为a2liok2 将不会显示在控制台上。

实际行动:
点击id为a1li后,点击id为a2liok2 将显示在控制台上。

为什么

document.getElementById("a2").removeEventListener("click",delegate);

无法删除兄弟节点上的事件监听器?
如何修复它?

最佳答案

如果监听器附加到某个元素,则删除它唯一可以做的就是从同一元素中删除相同的监听器 - 您无法从子元素中删除它,因为它没有附加到子元素.

对于您正在寻找的功能,您可以将要从中“删除”点击功能的节点添加到 Set 中,并在父节点的处理程序中检查 event.target(flag 变量)未包含在该 Set 中:

const elementsToIgnore = new Set();
function show1() {
  console.log("ok1");
  elementsToIgnore.add(document.getElementById("a2"));
}

function show2() {
  console.log("ok2");
}

function show3() {
  console.log("ok3");
}

function delegate(event) {
  var flag = event.target;
  if (elementsToIgnore.has(flag)) return;
  switch (flag.id) {
    case "a1":
      show1();
      break;
    case "a2":
      show2();
      break;
    case "a3":
      show3();
      break;
  }
}

ob = document.getElementById("tl");
ob.addEventListener("click", delegate);
<ul id="tl">
  <li id="a1">a1</li>
  <li id="a2">a2</li>
  <li id="a3">a3</li>
</ul>

关于javascript - 为什么不能删除兄弟节点上的事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53993653/

相关文章:

javascript - JavaScript 中的对象同时定义和未定义(在 FireFox 扩展中)

javascript - 如何在满足特定条件时删除 Vue 2 中的 eventListener (window.removeEventListener)

NHibernate 保存/更新事件监听器 : listening for child object saves

javascript - 使用 JavaScript 进行 RegEx 匹配和分离

javascript - 从 PHP 文件中提取要显示的单选按钮的值

javascript - jQuery - 将类从子元素添加到父元素

html - Canvas 消耗大量内存

javascript - 调用窗口模糊时避免元素模糊处理程序(浏览器失去焦点)

javascript - 为网页创建弹出(或者是弹出窗口?)窗口

javascript - 未捕获错误 : Expected onClick listener to be a function, 而得到类型字符串