我有一个创建div
的for循环 - 包含' category1',' category2'等ID的元素循环遍历键/值数组,如下所示:
"0" : "Java",
"1" : "JavaScript",
"2" : "HTML"
因此,div的ID是'类别' +关键。
在将元素添加到container-div的innerHTML
的for循环中,我添加了一个onclick
- 事件。
这是我正在谈论的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调试器并输入&#34; category3.onclick&#34;它说null。如果我输入&#34; category4.onclick&#34; (这是最后一个)它返回正确的函数。
这怎么可能?以及如何解决?
答案 0 :(得分:2)
这是范围界定的问题。 click处理程序指向最后一个值,因为它是循环结束时的结果。这是一种捕获价值的方法。
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);