开发者问题收集

未捕获的类型错误:无法读取未定义的属性“classList”

2016-09-14
4065

我正在尝试使用 js 为我的网站制作简单的滑块,但是遇到了问题。

我有一个变量“i”,但是无法使用它。

您可以查看我的代码。

这个问题的解决方案是什么?

    var slider = [];
    var radio = [];

for (var i = 1; document.querySelector('.radio-' + i) !== null; i++) { //this variable

radio[i] = document.querySelector('.radio-' + i);
radio[i].addEventListener('click', function () {
    for (var u = 1; document.querySelector('.slider' + u) !== null; u++) {
        slider[u] = document.querySelector('.slider' + u);

        if (slider[u].classList.contains('slider-show')) {
            slider[u].classList.remove('slider-show');
        }
    }
    slider[i].classList.add('slider-show'); //want to use here
});
}
2个回答

出现问题的原因是,当单击其中一个单选按钮时,var i 被设置为循环的最后一个索引。

为了在侦听器定义时跟踪 i 的值,您必须使用闭包:

var listener = (function (i) {

  return function(evt){

    for (var u = 1; document.querySelector('.slider' + u) !== null; u++) {
      slider[u] = document.querySelector('.slider' + u);

      if (slider[u].classList.contains('slider-show')) {
           slider[u].classList.remove('slider-show');
       }
    }
    slider[i].classList.add('slider-show');
  }
})(i);

radio[i].addEventListener('click', listener);
OBDM
2016-09-14

I. 在 ES5 中,您需要在 radio 和 slider 之间建立某种联系,我建议在 radio 中使用数据属性,例如 data-i ,在 slider 中使用相同的属性。有问题的行将如下所示:

slider[this.dataset.i].classList.add('slider-show');

radio 和 sliders 都需要具有 data-i 属性。因此 radio 1 具有 data-i="1" ,slider 1 具有 data-i="1"

II. 在 ES5 中,您还可以使用具有自身变量范围的匿名函数

for (var i = 1; document.querySelector('.radio-' + i) !== null; i++)     { 

function(i){

    //here rest of code with addEventListener
    //i is scope variable so it will work as supposed

}(i);

}

III. 在 ES6 中,将 i 声明为块变量,因此在 for 循环中使用 let i 而不是 var i

Maciej Sikora
2016-09-14