Est-il possible d’ajouter un écouteur d’événement (javascript) à tous les éléments générés dynamiquement?.
pour tous les éléments créés lors du chargement de la page, j'utilise:
doc.body.addEventListener('click', function(e){
//my code
},true);
J'ai besoin d'une méthode pour appeler ce code lorsque de nouveaux éléments apparaissent sur la page, mais je ne peux pas utiliser jQuery (déléguer, activer, etc. ne peut pas fonctionner dans mon projet). Comment puis-je faire ceci?
Il semble que vous deviez poursuivre une stratégie de délégation sans recourir à une bibliothèque. J'ai posté un exemple de code dans un Fiddle ici: http://jsfiddle.net/founddrama/ggMUn/
L’essentiel est d’utiliser la variable target
sur l’objet event
pour rechercher les éléments qui vous intéressent et répondre 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
}
});
CAVEATS! L'exemple Fiddle n'inclut que le code destiné aux navigateurs conformes aux normes (IE9 + et à peu près toutes les versions des autres) Si vous devez prendre en charge la "version précédente" attachEvent
, vous voudrez également fournissez votre propre wrapper personnalisé autour des fonctions natives appropriées. (Il y a beaucoup de bonnes discussions à ce sujet; j'aime bien la solution fournie par Nicholas Zakas dans son livre JavaScript professionnel pour les développeurs Web.)
Cela 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);
Ensuite, vous pouvez utiliser masterEventHandler()
pour gérer tous les clics.
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, à la différence qu’il utilise la méthode Element.matches()
pour vérifier si la cible correspond à la chaîne de sélecteur donnée.
addDynamicEventListener(document.body, 'click', '.myClass, li', function (e) {
console.log('Clicked', e.target.innerText);
});
Vous pouvez obtenir si de github .
Délégation de la tâche anonyme à HTML
elements
créée dynamiquement avec event.target.classList.contains('someClass')
true
ou false
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
})}})
Référence: https://gomakethings.com/attaching-multiple-elements-to-a-single-event-listener-in-Vanilla-js/