2015-02-18 123 views
4

我有一个for循环,创建div-id元素,如'category1','category2'等。循环遍历一个键/值数组,如下所示:动态创建元素并添加onclick事件不起作用

"0" : "Java", 
"1" : "JavaScript", 
"2" : "HTML" 

所以,div的ID是'category'+键。

在将元素添加到容器div的innerHTML的for循环中,我添加了一个onclick -event。

这是for循环,我说的是:

for (var key in categories) { 
    categoriesBlock.innerHTML += '<div class="category" id="category' + key + '">' + categories[key] + '</div>'; 

    document.getElementById('category' + key).onclick = function() { showPostsForCategory(key, categories[key]); } 
} 

其中categories是上述阵列。

问题是,onclick只适用于数组中的LAST元素。如果我使用Safari调试器进行检查并键入“category3.onclick”,它将显示为空。如果我输入“category4.onclick”(这是最后一个),它将返回正确的功能。

这怎么可能?以及如何解决它?

+0

调试工具中呈现的html看起来像什么? – Dragony 2015-02-18 00:17:03

+0

正如你期望的那样,只需要正常的div。 – JeroenJK 2015-02-18 06:37:20

回答

2

这是一个范围界定问题。点击处理程序指向最后一个值,因为这就是循环结束时的结果。这是一种捕捉价值的方法。

for (var key in categories) {   
    (function(){ 
     var _key = key; 
     document.getElementById('category' + _key).onclick = function() { showPostsForCategory(_key, categories[_key]); } 
    })(); 
} 

编辑...

此外,字符串连接不是创建HTML元素的理想方法。在某些浏览器中,插入文本时以及它变成实际的html元素之间可能存在延迟。

var div = document.createElement('div'); 
div.onclick = function(){...}; 
categoriesBlock.appendChild(div); 
+0

这不起作用。它给出了相同的结果:只有最后一个有一个onclick事件。很奇怪。你还有其他建议吗? – JeroenJK 2015-02-18 15:38:34

+0

我更新了答案。 – 2015-02-18 16:43:21

+0

最后它的作品!我将你的初始答案('_key'和嵌套函数)与你编辑的答案结合起来。现在它可以工作。它没有什么意义,特别是因为我以前没有真正使用过JavaScript。无论如何,谢谢! – JeroenJK 2015-02-18 18:55:33

相关问题