J'ai cette mise en page qui a été créée dynamiquement:
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>
Et je veux obtenir l'événement en cliquant sur chacun h4 class="name"
et afficher un journal avec le numéro i
associé.
Cependant, console.log
ne montre que le dernier i
associé ( i=9
dans ce cas), et ne fonctionne pas avec les autres i
numéros. Pourquoi cela arrive-t-il? Que dois-je faire?
javascript
html
innerhtml
Luiz Adorno
la source
la source
for
boucle appelant une méthode pour appliquer des événements à ces éléments, mais je ne sais pas. sera jsFiddle pour tester..card-body
et vérifier si l'élément (target
) est une ancre avec un ID commençant partitle
.innerHTML += ...
tue les écouteurs d'événements précédemment définis, pas la fermeture. Utilisezdocument.createElement
plutôt. Voir ce filRéponses:
innerHTML
redessine le html complet, par conséquent tous les événements précédemment attachés sont perdus. UtilisationinsertAdjacentHTML()
la source
insertAdjacentHTML
- tous les jours un jour d'école, vraiment sympa.document.getElementById
immédiatement après l'ajout du code HTML. Si vous ajoutez des centaines d'éléments, cela représente beaucoup de travail de traversée.name
et l'attribution de l'événement à cette classe tout en passant par l'élément (ou peut-être simplement en lisant l'événement lui-même) seraient-elles plus efficaces?document.createElement
peut être utilisé, je pense que c'est généralement la meilleure approche de base. Une autre amélioration possible de ce post est d'utiliser deux boucles: une pour construire tout le HTML, puis une autre pour récupérer tous les éléments en utilisant une classe en un seuldocument.querySelectorAll
appel et ajouter les écouteurs d'événements.L'utilisation de
+=
oninnerHTML
détruit les écouteurs d'événements sur les éléments à l'intérieur du HTML. La bonne façon de procéder consiste à utiliserdocument.createElement
. Voici un exemple minimal et complet:Bien sûr, le
document.getElementById
n'est pas nécessaire ici puisque nous venons de créer l'objet dans le bloc de boucle. Cela permet d'économiser des promenades dans les arbres potentiellement coûteuses.Si vous avez des morceaux arbitraires de code HTML stratifié comme dans votre exemple, vous pouvez utiliser
createElement("div")
, définir sainnerHTML
fois sur le morceau et ajouter des écouteurs selon les besoins. Ajoutez ensuite les divs en tant qu'enfants de votre élément conteneur.la source
<div>
, alorsdiv.innerHTML += yourHugeChunkOfHTML
. Il n'y a donc aucune raison que cela ne fonctionne pour aucun cas d'utilisation.