javascript - 如何使用事件委托而不是将事件侦听器单独附加到每个项目?
问题描述
如何将此代码转换为事件委托?
这是 HTML 代码
<ul id="todo-app">
<li class="item">Walk the dog</li>
<li class="item">Pay bills</li>
<li class="item">Make dinner</li>
<li class="item">Code for one hour</li>
</ul>
Javascript代码
document.addEventListener('DOMContentLoaded', function() {
let app = document.getElementById('todo-app');
let items = app.getElementsByClassName('item');
// attach event listener to each item
for (let item of items) {
item.addEventListener('click', function() {
alert('you clicked on item: ' + item.innerHTML);
});
}
});
上面的代码在技术上是有效的,问题在于,将一个事件监听器单独附加到每个项目。使用上面的代码应用程序最终可能会产生数百个事件侦听器,更有效的解决方案是将一个事件侦听器实际附加到整个容器,然后能够在实际单击时访问每个项目。
那么,如何使用事件委托制作这段代码呢?
解决方案
在纯 Js 中实现您想要的所有你需要知道的是这篇文章事件委托 - 大卫沃尔什
你的情况是:
document.getElementById("todo-app").addEventListener("click",function(e) {
// e.target was the clicked element
if (e.target && e.target.matches("li.item")) {
console.log("List item clicked!");
}
});
<ul id="todo-app">
<li class="item">Walk the dog</li>
<li class="item">Pay bills</li>
<li class="item">Make dinner</li>
<li class="item">Code for one hour</li>
</ul>
希望能帮助到你!
推荐阅读
- javascript - Nodejs从嵌套函数返回结果
- apache-camel - Apache Camel 在处理时手动 NACK 消息
- javascript - 在回调函数的调用之间清空反应状态
- python - 如何填写 QComboBox?
- javascript - 使用 Electron-Builder 的 RaspberryPi SerialPorts 出现问题
- ajax - 如何重新加载表格的一部分?
- macos - 如何使用 GnuPlot 绘制 NetCDF 文件?
- python - 将现有驱动程序的 pageLoadStrategy 从 eager 切换为 normal
- c - If Else 条件中的 Continue 语句给出无限循环
- angular - 提供了重复的列名:角材料数据表