动态创建元素并添加onclick事件不起作用

Jer*_*nJK 5 html javascript arrays

我有一个for循环,可使用div-category1,'category2'等ID 创建-elements。循环通过键/值数组,看起来像这样:

"0" : "Java",
"1" : "JavaScript",
"2" : "HTML"
Run Code Online (Sandbox Code Playgroud)

因此,div的ID为“类别” +键。

在将元素添加到innerHTMLcontainer-div 的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]); }
}
Run Code Online (Sandbox Code Playgroud)

categories上面的数组在哪里。

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

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

pos*_*abs 3

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

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

编辑...

此外,字符串连接并不是创建 html 元素的理想方式。在某些浏览器中,插入文本和文本成为实际 html 元素之间可能存在延迟。

var div = document.createElement('div');
div.onclick = function(){...};
categoriesBlock.appendChild(div);
Run Code Online (Sandbox Code Playgroud)