Ich habe dieses Layout, das dynamisch erstellt wurde:
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>
Und ich möchte, dass das Ereignis auf jedes klickt h4 class="name"
und ein Protokoll mit der entsprechenden Nummer i
anzeigt.
Allerdings console.log
zeigt nur die letzten i
verwandte ( i=9
in diesem Fall), und funktioniert nicht mit den anderen i
Zahlen. Warum passiert das? Was muss ich tun?
javascript
html
innerhtml
Luiz Adorno
quelle
quelle
for
Schleife eine Methode aufgerufen hat , um Ereignisse auf diese Elemente anzuwenden, aber ich weiß es nicht. wird jsFiddle testen..card-body
und überprüft, ob das Element (target
) ein Anker mit und eine ID ist, die mit beginnttitle
.innerHTML += ...
Schließungen sind nicht erforderlich, das Problem besteht darin , die zuvor festgelegten Ereignis-Listener zu töten, nicht die Schließung. Verwenden Siedocument.createElement
stattdessen. Siehe diesen ThreadAntworten:
innerHTML
Zeichnet das vollständige HTML neu, wodurch alle zuvor angehängten Ereignisse verloren gehen. VerwendeninsertAdjacentHTML()
quelle
insertAdjacentHTML
- Everydays ein Schultag , wirklich nett.document.getElementById
sofort nach dem Hinzufügen des HTML zu verwenden. Wenn Sie Hunderte von Elementen hinzufügen, ist dies eine Menge Durchquerungsarbeit.name
Wäre es effizienter , die Klasse zu verwenden und das Ereignis nur dieser Klasse zuzuordnen, während das Element durchlaufen wird (oder vielleicht nur aus dem Ereignis selbst zu lesen)?document.createElement
verwendet werden kann, denke ich, dass dies im Allgemeinen der beste Basisansatz ist. Eine weitere mögliche Verbesserung dieses Beitrags besteht darin, zwei Schleifen zu verwenden: eine zum Erstellen des gesamten HTML-Codes und eine weitere zum Abrufen aller Elemente mithilfe einer Klasse in einemdocument.querySelectorAll
Aufruf und Hinzufügen der Ereignis-Listener.Die Verwendung von
+=
oninnerHTML
zerstört Ereignis-Listener für die Elemente im HTML. Der richtige Weg, dies zu tun, ist zu verwendendocument.createElement
. Hier ist ein minimales, vollständiges Beispiel:Dies ist hier natürlich
document.getElementById
nicht erforderlich, da wir das Objekt gerade im Schleifenblock erstellt haben. Dies spart potenziell teure Baumwanderungen.Wenn Sie wie in Ihrem Beispiel über beliebige Abschnitte mit String-HTML verfügen, können Sie diese verwenden
createElement("div")
,innerHTML
einmal auf den Block setzen und nach Bedarf Listener hinzufügen. Fügen Sie dann die divs als untergeordnete Elemente Ihres Containerelements hinzu.quelle
<div>
, danndiv.innerHTML += yourHugeChunkOfHTML
. Es gibt also keinen Grund, warum dies für keinen Anwendungsfall funktionieren sollte.