I've this layout that was created dynamically:
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>
And I want to get the event click on each h4 class="name" and show a log with the number i related.
However, console.log shows only the last i related (i=9 in this case), and doesn't work with the other i numbers. Why does this happen? What do I have to do?
onclick = function(event) { var target = event. target || event. srcElement; alert ( target. innerHTML ); };
innerHTML = '<div id=\"a\">Test onclick</div>'; document. getElementById('a'). onclick = function() { alert("Click Event Fired !") }
You can detect clicks inside the page with a simple click event handler: document. onclick= function(event) { // Compensate for IE<9's non-standard event model // if (event===undefined) event= window.
The use of innerHTML creates a potential security risk for your website. Malicious users can use cross-site scripting (XSS) to add malicious client-side scripts that steal private user information stored in session cookies. You can read the MDN documentation on innerHTML .
Using += on innerHTML destroys event listeners on the elements inside the HTML. The correct way to do this is to use document.createElement. 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 saves potentially expensive tree walks.
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));
}
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With