* Esto fue editado para permitir que los niños de la clase objetivo activen los eventos. Vea la parte inferior de la respuesta para más detalles. * *
Una respuesta alternativa para agregar un detector de eventos a una clase donde los elementos se agregan y eliminan con frecuencia. Esto está inspirado en la on
función de jQuery, donde puede pasar un selector para un elemento secundario que el evento está escuchando.
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
}
});
Violín: https://jsfiddle.net/u6oje7af/94/
Esto escuchará los clics en los base
elementos secundarios del elemento y si el objetivo de un clic tiene un elemento primario que coincida con el selector, se manejará el evento de clase. Puede agregar y eliminar elementos como desee sin tener que agregar más oyentes de clics a los elementos individuales. Esto los atrapará a todos incluso para los elementos agregados después de que se agregó este oyente, al igual que la funcionalidad jQuery (que imagino que es algo similar bajo el capó).
Esto depende de los eventos que se propagan, por lo que si está stopPropagation
en el evento en otro lugar, esto puede no funcionar. Además, la closest
función tiene algunos problemas de compatibilidad con IE aparentemente (¿qué no?).
Esto podría convertirse en una función si necesita realizar este tipo de acción escuchando repetidamente, como
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);
}
});
}
=========================================
EDITAR: Esta publicación originalmente utilizó la matches
función para Elementos DOM en el destino del evento, pero esto restringió los destinos de los eventos solo a la clase directa. Se ha actualizado para usar la closest
función en su lugar, permitiendo que los eventos en los hijos de la clase deseada también activen los eventos. El matches
código original se puede encontrar en el violín original:
https://jsfiddle.net/u6oje7af/23/