2012-05-21 42 views
0
事件

可能重复:
Javascript only sets attribute for last item in arrayJavaScript和循环

我刚刚潜入一些基本的JavaScript + DOM学习,不是很明白只有最后一个元素正在切换?我对于为什么附加一个事件到一个元素感到迷失,似乎也覆盖了以前的事件。

的JavaScript:

window.onload = function() { 
    // Simple log 
    var c = function(x) { 
     return console.log(x); 
    }; 

    var hasClass = function(ele, cls) { 
     return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); 
    }; 

    var toggleClass = function(ele, cls) { 
     if (!hasClass(ele, cls)) { 
      ele.className += " " + cls; 


     } else { 
      var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); 
      ele.className = ele.className.replace(reg, ''); 
     } 
    }; 

    var toggle = function(clk) { 
     c(clk); 
    } 

    var el = document.getElementsByClassName('time'); 
    for (i = 0; i < el.length; i++) { 
     var btnToggle = el[i].getElementsByClassName('btn-toggle')[0]; 
     var clk = el[i].getElementsByClassName('clock')[0]; 
     btnToggle.addEventListener('click', function() { 
      toggle(clk) 
     }, false); 
    } 
};​ 

HTML:

<section> 
    <div class="time"> 
     <a href="#" class="btn-toggle">Show the time</a> 
     <div class="clock">Clock1</div> 
    </div> 

    <div class="time"> 
     <a href="#" class="btn-toggle">Show the time</a> 
     <div class="clock">Clock2</div> 
    </div> 

    <div class="time"> 
     <a href="#" class="btn-toggle">Show the time</a> 
     <div class="clock">Clock3</div> 
    </div> 

</section> 

感谢您明智的建议!

+0

您可以在正则表达式中使用'\\ b'而不是'\\ s | ^'构造。 '\ b'特殊表达式匹配一个单词的“边缘”,所以它正是你希望用于在空格分隔的类列表中匹配类名的。 – Pointy

+1

贤者忠告:如果你正在做很多客户端操纵,进入像jQuery这样的框架。上面所有的js在使用jQuery时都是大约3行javascript。 – Jamiec

+0

是的,我知道jquery - 并保持理智,我会永远在生产中使用它。在这种情况下,我只是玩弄一些JS而已。 – Galaxy

回答

3

您需要添加一个闭合:

for (i=0;i<el.length;i++) { 
    var btnToggle = el[i].getElementsByClassName('btn-toggle')[0]; 
    var clk = el[i].getElementsByClassName('clock')[0]; 
    (function(){ 
     var x = clk; 
     btnToggle.addEventListener('click', function(){toggle(x)}, false); 
    })(); 
} 

这样,每次迭代有一个“私人”的范围,而clk没有被覆盖。