* Ceci a été modifié pour permettre aux enfants de la classe cible de déclencher les événements. Voir le bas de la réponse pour plus de détails. *
Une réponse alternative pour ajouter un écouteur d'événements à une classe où des éléments sont fréquemment ajoutés et supprimés. Ceci est inspiré par la on
fonction de jQuery où vous pouvez passer un sélecteur pour un élément enfant que l'événement écoute.
var base = document.querySelector('#base'); // the container for the variable content
var selector = '.card'; // any css selector for children
base.addEventListener('click', function(event) {
// find the closest parent of the event target that
// matches the selector
var closest = event.target.closest(selector);
if (closest && base.contains(closest)) {
// handle class event
}
});
Violon: https://jsfiddle.net/u6oje7af/94/
Cela écoutera les clics sur les enfants de l' base
élément et si la cible d'un clic a un parent correspondant au sélecteur, l'événement de classe sera géré. Vous pouvez ajouter et supprimer des éléments comme vous le souhaitez sans avoir à ajouter plus d'écouteurs de clic aux éléments individuels. Cela les rattrapera même pour les éléments ajoutés après l'ajout de cet écouteur, tout comme la fonctionnalité jQuery (qui, j'imagine, est quelque peu similaire sous le capot).
Cela dépend des événements qui se propagent, donc si vous êtes stopPropagation
sur l'événement ailleurs, cela peut ne pas fonctionner. De plus, la closest
fonction a apparemment des problèmes de compatibilité avec IE (qu'est-ce qui ne l'est pas?).
Cela pourrait être transformé en une fonction si vous devez effectuer ce type d'action en écoutant à plusieurs reprises, comme
function addChildEventListener(base, eventName, selector, handler) {
base.addEventListener(eventName, function(event) {
var closest = event.target.closest(selector);
if (closest && base.contains(closest)) {
// passes the event to the handler and sets `this`
// in the handler as the closest parent matching the
// selector from the target element of the event
handler.call(closest, event);
}
});
}
=========================================
EDIT: Ce message utilisait à l'origine la matches
fonction pour Éléments DOM sur la cible de l'événement, mais cela a limité les cibles des événements à la classe directe uniquement. Il a été mis à jour pour utiliser la closest
fonction à la place, permettant aux événements sur les enfants de la classe souhaitée de déclencher également les événements. Le matches
code d' origine se trouve sur le violon d'origine:
https://jsfiddle.net/u6oje7af/23/