QuerySelectorAll 不适用于 onclick 事件

QuerySelectorAll not working with onclick event

场景

我有一些文本输入,我希望它们在被点击时具有 500 像素的宽度。

我的代码

var inputs = document.querySelectorAll("input[type=text]")
for(i=0; i<inputs.length; i++){
 inputs[i].onclick = function(){
  inputs[i].style.width = "500px";
 }
}
<input type="text" id="sometext">

什么不起作用

在 chrome 控制台上,我在以下行中得到 "Cannot read property 'style' of undefined":inputs[i].style.width = "500px"; 当我单击输入时。

我的问题

如何修复我的代码?

"Cannot read property 'style' of undefined"

您看到此错误的原因是 for 循环已经结束并且 iinputs NodeList 的边界之外 click 事件被触发。换句话说,由于数组中最后一个元素的索引比长度小 1,因此 inputs[i] 未定义,因为 i 等于 NodeList 的长度,而 click 事件侦听器是解雇了。

要解决此问题,您可以将 inputs[i] 更改为 this 以访问单击的元素。这样做,您就不必使用 i(这是导致问题的原因):

var inputs = document.querySelectorAll("input[type=text]")
for (i = 0; i < inputs.length; i++) {
  inputs[i].addEventListener('click', function() {
    this.style.width = "500px";
  });
}

或者,您可以使用 IIFE 在每次迭代中传递 i 的值:

var inputs = document.querySelectorAll("input[type=text]")
for (i = 0; i < inputs.length; i++) {
  (function(i) {
    inputs[i].addEventListener('click', function() {
      inputs[i].style.width = "500px";
    });
  })(i);
}

您也可以使用 .bind() method 来传递 i 的值:

var inputs = document.querySelectorAll("input[type=text]")
for (i = 0; i < inputs.length; i++) {
  inputs[i].addEventListener('click', function(i) {
    inputs[i].style.width = "500px";
  }.bind(this, i));
}