技术解析

可以在 for 循环里,添加 btn.addEventListener("click", function(){...} 事件吗?
0
2021-08-17 02:33:40
idczone

可以在 for 循环里,使用 btn.addEventListener("click", function(){...} 吗?



可以,不过事件会冒泡,在父元素捕获的话,只需要一次。

另外还要注意 i 的引用问题。建议使用 arrow function,否则 function 引用的是闭包外的 i,当 click 事件触发时 i 永远是 btns.length

建议用 1 楼的方法在父元素捕获

用事件委托

这会都绑定在最后一个 btn 上吧

事件委托就是干这个的,你这么写太笨了

用事件委托绑定在上层节点

goog
js 事件代理 事件委托

单层:
```
document.addEventListener('click', (event) => {
if (event.target.tagName !== 'BUTTON') return;
// do something;
})
```
如果是多层的话:
```
document.addEventListener("click", event => {
if (!event.target.closest("button")) return;
console.log("Doing something");
});
```
Demo:
https://codesandbox.io/s/compassionate-williams-09ssq
只是一个思路,供参考

把 var 换个 let 比较好

target 来做会好一些

之前在网上看到冒泡捕获的例子,好像就是你这个问题,我记得是可以把监听绑在父层去调用,具体代码你搜冒泡捕获关键字,在简书还是 cnblog 上就有的

用原生有点别手,如果有框架的话就方便多了,可以试试呀

《 JavaScript 高级程序设计》或者《 javascript 权威指南》两者选一本看看

如果在回调里获取 i 会始终是一个值,参考 JavaScript 闭包

事件委托

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服