* Це було відредаговано, щоб діти цільового класу могли викликати події. Деталі див. У нижній частині відповіді. *
Альтернативна відповідь, щоб додати слухача подій до класу, де елементи часто додаються та видаляються. Це натхнене функцією jQuery, onде ви можете передати селектор для дочірнього елемента, який подія слухає.
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/
Це послухає натискання на діти baseелемента, і якщо в цілі клацання є батько, який відповідає селектору, подія класу буде оброблятися. Ви можете додавати та видаляти елементи, як вам подобається, не потрібно додавати більше слухачів кліків до окремих елементів. Це зачепить їх навіть за елементи, додані після того, як цей слухач був доданий, подібно до функціональності jQuery (який, я думаю, дещо схожий під капотом).
Це залежить від подій, що поширюються, тож якщо ви stopPropagationподії десь в іншому місці, це може не спрацювати. Крім того, у closestфункції є деякі проблеми сумісності з IE, мабуть (що ні?).
Це може бути перетворено на функцію, якщо вам потрібно виконувати прослуховування цього типу кілька разів, наприклад
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: Ця публікація спочатку використовувала цю matchesфункцію для Елементи DOM на меті події, але це обмежило цілі подій лише прямим класом. Він був оновлений, щоб використовувати closestфункцію замість цього, дозволяючи подіям на дітей потрібного класу ініціювати події. Оригінальний matchesкод можна знайти в оригінальній скрипці:
https://jsfiddle.net/u6oje7af/23/