javascript - 在forEach循环javascript中的任何一个元素上只添加一次事件监听器
问题描述
我有一个 NodeList 数组。我遍历每个 NodeList 元素并添加点击事件监听器。
var itemsList = document.querySelectorAll('.items');
itemList.forEach(item => {
item.addEventListener('click', () => {
console.log('clicked');
})
})
一旦我单击了任何一个项目,我也想删除所有其他项目的事件侦听器。每个项目是否被点击都没有关系。
解决方案
要在不使用 jQuery 或任何东西的情况下直接执行此操作,并且不会过于复杂,您可以执行以下操作:
const itemsList = document.querySelectorAll('.items');
const onClick = () => {
console.log('clicked');
itemsList.forEach(item => {
item.removeEventListener('click', onClick);
});
};
itemsList.forEach(item => {
item.addEventListener('click', onClick);
});
基本上,您保留对 click 函数的引用,并且该函数本身将从列表中的所有节点中删除。
如果你想知道哪个项目被点击了,你可以在onClick
函数中添加一个参数,这将是点击事件,你可以从中获取被点击的项目,如下所示:
const itemsList = document.querySelectorAll('.items');
const onClick = event => {
const clickedItem = event.target
console.log('clicked on ' + clickedItem.textContent);
itemsList.forEach(item => {
item.removeEventListener('click', onClick);
});
};
itemsList.forEach(item => {
item.addEventListener('click', onClick);
});
沿着这些思路,您可以参考实际点击了哪个项目。
推荐阅读
- python - 如何在python中确定两个向量是线性相关还是独立的?
- c# - PlayAgain 方法
- java - 使用 lombok 1.18.12 构建的 gradle 6.4 不生成 getter 和 setter
- python - 如何在 Python 3 中使用生成器管道?
- javascript - 如何使用 Redux Saga debounce 但先获取而不是等待 n 毫秒
- php - MDB Jquery - 线性步进器 - 重置功能
- debugging - 解析 DWARF 的有效方法
- python - 如何在特征少于最初训练的原始数据集的数据集上使用标准缩放器模型
- xamarin.forms - Xamarin.MacOS 的图像按钮
- sql-server-2008 - 计数和求和函数在左连接中不起作用