【问题标题】:Dynamically creating elements and adding onclick event not working动态创建元素并添加 onclick 事件不起作用
【发布时间】:2015-02-18 00:07:39
【问题描述】:

我有一个 for 循环,它创建 div-elements,其 ID 为“category1”、“category2”等。循环通过一个键/值数组,如下所示:

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

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

在将元素添加到容器 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 仅适用于数组中的最后一个元素。如果我检查 Safari 调试器并输入“category3.onclick”,它会显示为空。如果我输入“category4.onclick”(这是最后一个),它会返回正确的函数。

这怎么可能?又该如何解决呢?

【问题讨论】:

  • 调试工具中渲染出来的html是什么样子的?
  • 只是普通的 div,正如您对代码所期望的那样。

标签: javascript html arrays


【解决方案1】:

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

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);

【讨论】:

  • 这不起作用。它给出了相同的结果:只有最后一个有 onclick 事件。很奇怪。您还有其他想法吗?
  • 终于成功了!我将您的初始答案(_key 和嵌套函数)与您编辑的答案结合在一起。现在它起作用了。这没有多大意义,尤其是因为我以前没有真正使用过 JavaScript。无论如何,谢谢!
猜你喜欢
  • 2023-03-06
  • 2014-01-28
  • 2020-03-24
  • 2017-02-13
  • 2016-10-04
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2012-01-21
相关资源
最近更新 更多