可以在 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 闭包
事件委托