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 irelacionado.
Sin embargo, console.logmuestra solo el último irelacionado ( i=9en este caso) y no funciona con los otros inúmeros. ¿Por qué pasó esto? ¿Que tengo que hacer?
                    
                        javascript
                                html
                                innerhtml
                                
                    
                    
                        Luiz Adorno
fuente
                
                fuente

forbucle llamando a un método para aplicar eventos a esos elementos, pero no lo sé. jsFiddle para probar..card-bodyy 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.createElementlugar. Ver este hiloRespuestas:
innerHTMLvuelve 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.getElementByIdinmediatamente después de agregar el HTML. Si está agregando cientos de elementos, esto es mucho trabajo de desplazamiento.namerendimiento 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.createElementse 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.querySelectorAllllamada y agregar los oyentes de eventos.Usar
+=oninnerHTMLdestruye 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.getElementByIdaquí 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"), establecerloinnerHTMLuna 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.