* Questo è stato modificato per consentire ai bambini della classe target di attivare gli eventi. Vedi in fondo alla risposta per i dettagli. *
Una risposta alternativa per aggiungere un listener di eventi a una classe in cui gli elementi vengono aggiunti e rimossi frequentemente. Questo si ispira alla on
funzione di jQuery in cui è possibile passare un selettore per un elemento figlio su cui l'evento è in ascolto.
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
}
});
Fiddle: https://jsfiddle.net/u6oje7af/94/
Questo ascolterà i clic sui figli base
dell'elemento e se la destinazione di un clic ha un genitore corrispondente al selettore, verrà gestito l'evento di classe. Puoi aggiungere e rimuovere elementi a tuo piacimento senza dover aggiungere più listener di clic ai singoli elementi. Questo li catturerà tutti anche per gli elementi aggiunti dopo l'aggiunta di questo ascoltatore, proprio come la funzionalità jQuery (che immagino sia in qualche modo simile sotto il cofano).
Questo dipende dalla propagazione degli eventi, quindi se si è stopPropagation
sull'evento da qualche altra parte, questo potrebbe non funzionare. Inoltre, la closest
funzione ha apparentemente alcuni problemi di compatibilità con IE (cosa no?).
Questo potrebbe essere trasformato in una funzione se è necessario eseguire questo tipo di azione ascoltando ripetutamente, ad esempio
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);
}
});
}
=========================================
MODIFICA: Questo post originariamente utilizzava la matches
funzione per Elementi DOM sulla destinazione dell'evento, ma ciò ha limitato le destinazioni degli eventi solo alla classe diretta. È stato aggiornato per utilizzare closest
invece la funzione, consentendo anche agli eventi sui bambini della classe desiderata di attivare gli eventi. Il matches
codice originale si trova sul violino originale:
https://jsfiddle.net/u6oje7af/23/