2015-04-21 107 views
0

我想讓eventlistener爲循環內創建的類工作。我無法得到它的工作,有什麼建議嗎?for循環後的addEventListener類;香草JS

window.onload = function(){ 
    var div = document.createElement('div'), 
    container = document.getElementById('container'), 
    classname = document.getElementsByClassName("hello"); 

    div.className = 'hello'; 

    var tasks = [ 
    'One', 
    'Two', 
    'Three', 
    'Four' 
    ]; 

    for (var i = 0; i < tasks.length; ++i) { 
    container.innerHTML += '<div class="hello"><p>' + tasks[i] + '</p></div>'; 
    } 

    classname.addEventListener('click', function(){ 
    this.className = 'done'; 
    }); 

    console.log(classname); 
}; 

回答

2

classnameNodeListaddEventListener爲各個節點的方法。您需要遍歷所有的元素:

for (i = 0; i < classname.length; i++) { 
    classname[i].addEventListener('click', function() { 
     this.className = 'done'; 
    } 
} 
+0

謝謝主席先生,這工作就像一個魅力!將不得不閱讀NodeList,所以我可以理解:) – NinjaGrisen

1

getElementsByClassName返回一個節點列表,這樣你就不能對添加事件偵聽器。您必須將事件偵聽器添加到此列表中的元素。

這樣得到:

//NodeList has not forEach method, but we can take it from an array 
[].forEach.call(classnameElements, function(classnameElement){ 
    classnameElement.addEventListener('click', function(){ 
    this.className = 'done'; 
    }); 
}): 
+1

'getElementsByClassName'返回一個活動的NodeList,所以它在DOM被修改時自動改變。 – Barmar

+0

真的嗎?我不知道!謝謝。 – Gael