Tengo este diseño que se creó dinámicamente:
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>
Y quiero obtener el evento, haga clic en cada uno h4 class="name"
y muestre un registro con el número i
relacionado.
Sin embargo, console.log
muestra solo el último i
relacionado ( i=9
en este caso) y no funciona con los otros i
números. ¿Por qué pasó esto? ¿Que tengo que hacer?
javascript
html
innerhtml
Luiz Adorno
fuente
fuente
for
bucle llamando a un método para aplicar eventos a esos elementos, pero no lo sé. jsFiddle para probar..card-body
y verifica si el elemento (target
) es un ancla con una ID que comienza contitle
.innerHTML += ...
matar a los oyentes de eventos previamente establecidos, no el cierre. Usar en sudocument.createElement
lugar. Ver este hiloRespuestas:
innerHTML
vuelve a dibujar el html completo, como resultado se pierden todos los eventos adjuntos previamente. UtilizarinsertAdjacentHTML()
fuente
insertAdjacentHTML
, todos los días de escuela, muy agradable.document.getElementById
inmediatamente después de agregar el HTML. Si está agregando cientos de elementos, esto es mucho trabajo de desplazamiento.name
rendimiento fuera de interés sería usar la clase y asociar el evento solo a esa clase mientras pasa por el elemento (o tal vez solo leer el evento en sí) ¿sería más eficiente?document.createElement
se puede usar, creo que ese es generalmente el mejor enfoque de referencia. Otra posible mejora de esta publicación es usar dos bucles: uno para construir todo el HTML, luego otro para tomar todos los elementos usando una clase en unadocument.querySelectorAll
llamada y agregar los oyentes de eventos.Usar
+=
oninnerHTML
destruye los oyentes de eventos en los elementos dentro del HTML. La forma correcta de hacer esto es usardocument.createElement
. Aquí hay un ejemplo mínimo y completo:Por supuesto,
document.getElementById
aquí no es necesario ya que acabamos de crear el objeto en el bloque de bucle. Esto ahorra caminatas arbóreas potencialmente caras.Si tiene fragmentos arbitrarios de HTML en cadena como en su ejemplo, puede usarlo
createElement("div")
, establecerloinnerHTML
una vez en el fragmento y agregar oyentes según sea necesario. Luego agregue los divs como elementos secundarios de su elemento contenedor.fuente
<div>
, entoncesdiv.innerHTML += yourHugeChunkOfHTML
. Así que no hay razón para que esto no funcione para ningún caso de uso.