2016-09-14 45 views
0

我正在试图为js上的我的网站做简单的滑块,但是我遇到了问题。未捕获TypeError:无法读取undefined属性'classList'

我有变量“我”,我不能使用它。

你可以在我的代码中看到。

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

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 
}); 
} 
+1

的可能的复制[JavaScript的闭包内环路 - 简单实用的例子(http://stackoverflow.com /问题/ 750486/JavaScript的闭合内部 - 环 - 简单实用-示例) – Xufox

回答

0

在ES5你需要有收音机和滑块之间有着某种联系,我的建议是,例如data-i在无线电数据属性和滑块相同的属性。您的问题线路如下所示:

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

收音机和滑块都需要有data-i属性。所以收音机1有data-i="1",滑块1有data-i="1"

二,在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

1

您的问题的原因是var我点击其中一个单选按钮时设置为您的循环的最后一个索引。

跟踪值Ia你必须使用一个封闭的侦听器定义的时间:

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); 
相关问题