* Dies wurde bearbeitet, damit Kinder der Zielklasse die Ereignisse auslösen können. Einzelheiten finden Sie unten in der Antwort. * *
Eine alternative Antwort zum Hinzufügen eines Ereignis-Listeners zu einer Klasse, in der häufig Elemente hinzugefügt und entfernt werden. Dies ist inspiriert von der on
Funktion von jQuery, mit der Sie einen Selektor für ein untergeordnetes Element übergeben können, das das Ereignis abhört.
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
}
});
Geige: https://jsfiddle.net/u6oje7af/94/
Dadurch wird auf Klicks auf untergeordnete base
Elemente des Elements gewartet. Wenn für das Ziel eines Klicks ein übergeordnetes Element mit dem Selektor übereinstimmt, wird das Klassenereignis behandelt. Sie können Elemente beliebig hinzufügen und entfernen, ohne den einzelnen Elementen weitere Klick-Listener hinzufügen zu müssen. Dies wird sie alle auch für Elemente erfassen, die nach dem Hinzufügen dieses Listeners hinzugefügt wurden, genau wie die jQuery-Funktionalität (die ich mir unter der Haube etwas ähnlich vorstelle).
Dies hängt von den sich ausbreitenden Ereignissen ab. Wenn Sie sich also stopPropagation
an einem anderen Ort befinden, funktioniert dies möglicherweise nicht. Außerdem hat die closest
Funktion anscheinend einige Kompatibilitätsprobleme mit dem IE (was nicht?).
Dies könnte zu einer Funktion gemacht werden, wenn Sie diese Art von Aktion wiederholt abhören müssen, wie z
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);
}
});
}
========================================= BEARBEITEN
: Dieser Beitrag verwendete ursprünglich die matches
Funktion für DOM-Elemente auf dem Ereignisziel, dies beschränkte die Ziele von Ereignissen jedoch nur auf die direkte Klasse. Es wurde aktualisiert, um closest
stattdessen die Funktion zu verwenden, sodass Ereignisse für untergeordnete Elemente der gewünschten Klasse auch die Ereignisse auslösen können. Der Originalcode matches
befindet sich in der Originalgeige:
https://jsfiddle.net/u6oje7af/23/