简体   繁体   English

如何将事件监听器添加到html集合中的每个元素?

[英]How do I add an event listener to each element in an html collection?

function eventAdded(i) {
  console.log(inputs[i]);
}
var inputs = document.querySelectorAll('.js-capture__input input');
for (i = 0; i <= inputs.length; i++) {
  console.log(inputs[i]);
  inputs[i].addEventListener('change', eventAdded);
}

I am managing to log each inputs[i] to the console. 我正在设法将每个inputs[i]到控制台。 inputs[i] exists. inputs[i]存在。 But I am getting Uncaught TypeError: Cannot read property 'addEventListener' of undefined 但是我收到了Uncaught TypeError:无法读取未定义的属性'addEventListener'

How is this not defined if I can log each one to the console? 如果我可以将每个人都登录到控制台,该怎么定义呢? Can someone please explain like I'm 5? 有人可以解释一下我5岁吗?

Like @CertainPerformance said, your error is having i <= inputs.length instead of i < inputs.length . 就像@CertainPerformance所说的那样,您的错误是让i <= inputs.length而不是i < inputs.length

The difference is that in the first case, you are going outside the boundaries of the array. 区别在于,在第一种情况下,您将超出数组的边界。

For example, if you have an array of 5 elements (remember arrays are 0-based): 例如,如果您有一个由5个元素组成的数组(记住数组是从0开始的):

0
1
2
3
4

When you check using i <= inputs.length , this is what's happening: 当您使用i <= inputs.length检查时,正在发生以下情况:

0 <= 5: true
1 <= 5: true
2 <= 5: true
3 <= 5: true
4 <= 5: true
5 <= 5: true
6 <= 5: false

So instead of iterating 5 times, you are iterating 6 times. 因此,您不是要迭代5次,而是要迭代6次。 The last one ( i=5 ), is not within the array boundaries (its upper bound is 4 ). 最后一个( i=5 )不在数组边界内(其上限为4 )。

 function eventAdded(i) { console.log(inputs[i]); } var inputs = document.querySelectorAll('.js-capture__input input'); for (var i = 0; i < inputs.length; i++) { console.log(inputs[i]); inputs[i].addEventListener('change', eventAdded); } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM