ajouter un écouteur d'événement sur les éléments créés dynamiquement

est-il possible d'ajouter event listener (javascript) à tous les éléments générés dynamiquement? Je ne suis pas le propriétaire de la page, donc je ne peux pas ajouter un écouteur de manière statique.

pour tous les éléments créés lorsque la page est chargée j'utilise:

doc.body.addEventListener('click', function(e){
//my code
},true);

j'ai besoin d'une méthode pour appeler ce code quand de nouveaux éléments apparaissent sur la page, mais je ne peux pas utiliser jQuery (delegate, on, etc ne peut pas fonctionner dans mon projet). Comment puis-je faire cela?

38
demandé sur Damjan Pavlica 2013-01-10 17:14:45

5 réponses

il semble que vous ayez besoin de poursuivre une stratégie de délégation sans vous rabattre sur une bibliothèque. J'ai posté quelques exemples de code dans un violon ici:http://jsfiddle.net/founddrama/ggMUn/

L'essentiel c'est d'utiliser le target sur le event objet à rechercher les éléments qui vous intéressent, et de réagir en conséquence. Quelque chose comme:

document.querySelector('body').addEventListener('click', function(event) {
  if (event.target.tagName.toLowerCase() === 'li') {
    // do your action on your 'li' or whatever it is you're listening for
  }
});

mises en garde! L'exemple Fiddle ne comprend que le code pour les navigateurs conformes aux normes (c'est à dire, IE9+, et à peu près toutes les versions de tous les autres) Si vous avez besoin de soutien "vieux IE" attachEvent, alors vous voudrez également fournir votre propre wrapper personnalisé autour des fonctions natives appropriées. (Il y a beaucoup de bonnes discussions là-bas à ce sujet; J'aime la solution que Nicolas Zakas fournit dans son livre JavaScript Professionnel pour les développeurs web.)

68
répondu founddrama 2013-01-10 13:45:52

Dépend de la façon dont vous ajoutez de nouveaux éléments.

si vous ajoutez en utilisant createElement, vous pouvez essayer ceci:

var btn = document.createElement("button");
btn.addEventListener('click', masterEventHandler, false);
document.body.appendChild(btn);

alors vous pouvez utiliser masterEventHandler() pour gérer tous les clics.

10
répondu ATOzTOA 2013-01-10 13:28:26

j'ai créé une petite fonction pour ajouter des écouteurs d'événements dynamiques, similaire à jQuery.on().

il utilise la même idée que la réponse acceptée, seulement qu'il utilise le Element.matches() méthode pour vérifier si la cible correspond à la chaîne de sélection donnée.

addDynamicEventListener(document.body, 'click', '.myClass, li', function (e) {
    console.log('Clicked', e.target.innerText);
});

Vous pouvez obtenir si à partir de github.

1
répondu Cristy 2017-06-29 12:08:51

délégation de la anonyme de la tâche à créé dynamiquement HTMLelementsevent.target.classList.contains('someClass')

  1. retourne true ou false
  2. par exemple. let myEvnt = document.createElement('span'); myEvnt.setAttribute('class', 'someClass'); myEvnt.addEventListener('click', e => { if(event.target.classList.contains('someClass')){ console.log(${event.currentTarget.classList })}})

  3. référence: https://gomakethings.com/attaching-multiple-elements-to-a-single-event-listener-in-vanilla-js/

  4. Bonne Lecture: https://eloquentjavascript.net/15_event.html#h_NEhx0cDpml
  5. MDN : https://developer.mozilla.org/en-US/docs/Web/API/Event/Comparison_of_Event_Targets
  6. Points D'Insertion:
0
répondu Vipul Anand 2018-07-30 11:22:44

Utiliser classList propriété pour lier plus d'une classe à la fois

var container = document.getElementById("table");
container.classList.add("row", "oddrow", "firstrow");
-9
répondu Rakesh Gupta 2015-06-18 07:21:18