javascript - 动态添加和删除事件监听器

标签 javascript html addeventlistener

我在动态添加和删除事件监听器时遇到问题。我希望能够向元素的所有子节点添加事件监听器。然后稍后删除它们,然后将它们添加回来。

注意:我知道 EventListener 选项。但是这并不能完全解决我的问题。

这是我想要做的一些示例代码:

var cont;

window.onload = function() {
  cont = document.querySelector(".container");
  [...cont.children].forEach(c => {
    c.addEventListener("click", clicked.bind(c))
  });
}

function clicked() {
  console.log(`removing event listener from ${this}`);
  this.removeEventListener("click", clicked); //Not actually removing - why?
}

谢谢大家!

最佳答案

问题是 .bind 创建了一个函数。仅当将完全相同的函数传递给 removeEventListener 时,才能删除传递给 addEventListener 的函数。绑定(bind)函数与原始未绑定(bind)函数不同,因此如果您向其传递未绑定(bind)函数,removeEventListener 将不起作用。

在您的情况下,一种可能性是使用由 HTML 元素索引的 Map,其值是该元素的绑定(bind)监听器,以便稍后可以删除它们:

const listenerMap = new Map();
const cont = document.querySelector(".container");

[...cont.children].forEach(c => {
  const listener = clicked.bind(c);
  listenerMap.set(c, listener);
  c.addEventListener("click", listener);
});

function clicked() {
  console.log(`removing event listener from ${this}`);
  this.removeEventListener("click", listenerMap.get(this));
}
<div class="container">
  <div>one</div>
  <div>two</div>
  <div>three</div>
</div>

关于javascript - 动态添加和删除事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52788980/

相关文章:

Javascript mousemove 空事件处理程序泄漏内存?

javascript - 如何在 JQuery 中检查页面是否以打印模式显示?

javascript - 替换字符以仅获取图像 URL 失败

javascript - 将外部页面源存储在 Javascript 变量中?

javascript - 在 iframe 中加载外部网站但不发送 HTTP_REFERER

javascript - 使用 Angular 5 的 EventListener 不会更新 DOM

javascript - for...in 循环执行速度非常慢

javascript - 复选框多值颜色div

javascript - 使用 JavaScript 将按钮元素移动到不同的 div(父级)

使用 document.addEventListener 切换链接的 Javascript 数组