【发布时间】:2020-05-30 17:36:35
【问题描述】:
我有这个动态创建的布局:
for (let i = 1; i < 10; i++) {
document.querySelector('.card-body').innerHTML += `<div class="row" id="img_div">
<div class="col-12 col-sm-12 col-md-2 text-center">
<img src="http://placehold.it/120x80" alt="prewiew" width="120" height="80">
</div>
<div id="text_div" class="col-12 text-sm-center col-sm-12 text-md-left col-md-6">
<h4 class="name"><a href="#" id="title` + i + `">Name</a></h4>
<h4>
<small>state</small>
</h4>
<h4>
<small>city</small>
</h4>
<h4>
<small>zip</small>
</h4>
</div>
<div class="col-12 col-sm-12 text-sm-center col-md-4 text-md-right row">
</div>
</div>
`
document.getElementById("title" + i).addEventListener('click', function() {
console.log(i)
});
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<div class="card-body">
<!-- person -->
</div>
我想让事件点击每个h4 class="name" 并显示一个与数字i 相关的日志。
但是,console.log 仅显示最后一个相关的 i(在本例中为 i=9),并且不适用于其他 i 数字。为什么会这样?我该怎么办?
【问题讨论】:
-
也许使用 Document.createElement() 而不是传递 html-string & 你会更轻松 & 我认为你最终会得到更好的代码。
-
你将不得不再次遍历你的节点并将你无法附加到字符串中的事件附加到字符串中
-
很好的问题,这肯定有点棘手,我认为有可能在渲染后附加一个事件。例如,在您的
for循环调用一个方法以将事件应用于这些元素之后,但是我不知道。将jsFiddle进行测试。 -
为
.card-body创建了一个委托事件处理程序,并检查元素 (target) 是否是一个锚点,其 ID 以title开头。 -
啊,正要发布答案。投票决定重新开放。闭包不是必需的,问题是
innerHTML += ...杀死了先前设置的事件侦听器,而不是闭包。请改用document.createElement。见this thread
标签: javascript html innerhtml