* Zostało to zmodyfikowane, aby umożliwić dzieciom klasy docelowej wyzwalanie zdarzeń. Szczegóły znajdują się u dołu odpowiedzi. *
Alternatywna odpowiedź na dodanie detektora zdarzeń do klasy, w której elementy są często dodawane i usuwane. Jest to zainspirowane on
funkcją jQuery, w której można przekazać selektor elementu potomnego, którego słucha zdarzenie.
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/
Spowoduje to nasłuchiwanie kliknięć base
elementów podrzędnych elementu, a jeśli element docelowy kliknięcia ma element nadrzędny pasujący do selektora, zdarzenie klasy zostanie obsłużone. Możesz dodawać i usuwać elementy, jak chcesz, bez konieczności dodawania kolejnych detektorów kliknięć do poszczególnych elementów. Spowoduje to złapanie ich wszystkich nawet dla elementów dodanych po dodaniu tego detektora, podobnie jak funkcjonalność jQuery (która, jak sądzę, jest nieco podobna pod maską).
Zależy to od propagowania wydarzeń, więc jeśli zdarzy stopPropagation
się to w innym miejscu, może to nie działać. Ponadto closest
funkcja najwyraźniej ma pewne problemy ze zgodnością z IE (co nie?).
Można to zmienić w funkcję, jeśli trzeba wykonywać tego typu czynności wielokrotnie, np
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);
}
});
}
=========================================
EDYCJA: Ten post pierwotnie używał matches
funkcji Elementy DOM w celu zdarzenia, ale ograniczyło to cele zdarzenia tylko do klasy bezpośredniej. Zostało zaktualizowane, aby closest
zamiast tego używało tej funkcji, umożliwiając również wywoływanie zdarzeń na dzieciach pożądanej klasy. Oryginalny matches
kod można znaleźć na oryginalnym skrzypcach:
https://jsfiddle.net/u6oje7af/23/