如何在innerHTML中获取click事件?

Lui*_*rno 11 html javascript innerhtml

我有这个动态创建的布局:

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)
  });
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

我想让事件点击每个事件h4 class="name"并显示一个带有i相关数字的日志。

但是,console.log仅显示最后一个i相关(i=9在本例中),并且不适用于其他i数字。为什么会发生这种情况?我需要做什么?

ggo*_*len 8

使用+=oninnerHTML会破坏 HTML 内部元素上的事件侦听器。执行此操作的正确方法是使用document.createElement. 这是一个最小的完整示例:

for (let i = 1; i < 10; i++) {
  const anchor = document.createElement("a");
  document.body.appendChild(anchor);
  anchor.id = "title" + i;
  anchor.href= "#";
  anchor.textContent = "link " + i;
  document.getElementById("title" + i)
    .addEventListener("click", e => console.log(i));
}
Run Code Online (Sandbox Code Playgroud)
a {
  margin-left: 0.3em;
}
Run Code Online (Sandbox Code Playgroud)

当然,document.getElementById这里没有必要,因为我们只是在循环块中创建了对象。这节省了潜在的昂贵的树走。

for (let i = 1; i < 10; i++) {
  const anchor = document.createElement("a");
  document.body.appendChild(anchor);    
  anchor.href= "#";
  anchor.textContent = "link " + i;
  anchor.addEventListener("click", e => console.log(i));
}
Run Code Online (Sandbox Code Playgroud)
a {
  margin-left: 0.3em;
}
Run Code Online (Sandbox Code Playgroud)

如果您在示例中具有任意的字符串化 HTML 块,则可以使用createElement("div"),将其设置innerHTML一次到块并根据需要添加侦听器。然后将 div 添加为容器元素的子元素。

for (let i = 1; i < 10; i++) {
  const rawHTML = `<div><a href="#" id="link-${i}">link ${i}</a></div>`;
  const div = document.createElement("div");
  document.body.appendChild(div);
  div.href= "#";
  div.innerHTML = rawHTML;
  div.querySelector(`#link-${i}`)
    .addEventListener("click", e => console.log(i));
}
Run Code Online (Sandbox Code Playgroud)


Mam*_*mun 7

innerHTML重绘完整的 html,结果所有先前附加的事件都丢失了。用insertAdjacentHTML()

for(let i=1;i<10;i++){
    document.querySelector('.card-body').insertAdjacentHTML('beforeend',`<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)
  });
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 哇..我一直在摆弄类似的东西,但从来没有遇到过`insertAdjacentHTML` - 每天都是上学的日子,真的很好。 (3认同)