How can I get the click event inside an innerHTML?
Using +=
on innerHTML
destroys event listeners on the elements inside the HTML. Using document.createElement
ensures event listeners are preserved after appending children to a container.
Here's a minimal, complete example:
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));
}
a {
margin-left: 0.3em;
}
Of course, the document.getElementById
isn't necessary here since we just created the object in the loop block. This approach might help avoid generating ids dynamically, which seems like an antipattern.
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));
}
a {
margin-left: 0.3em;
}
If you have arbitrary chunks of stringified HTML as in your example, you can use createElement("div")
, set its innerHTML
once to the chunk and add listeners as needed. Then append the divs as children of your container element.
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));
}
Other approaches include appending to the innerHTML
but providing a class name on the links, then using a document.querySelectorAll(className)
after the HTML is built to add listeners to each link, or using event delegation to add a listener to the parent.
As a final note, usually styled <button>
elements are preferred over links that have a no-action #
href.
innerHTML
redraws the full html, as a result all the previously attached events are lost. Use 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)
});
}
<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>