* Це було відредаговано, щоб діти цільового класу могли викликати події. Деталі див. У нижній частині відповіді. *
Альтернативна відповідь, щоб додати слухача подій до класу, де елементи часто додаються та видаляються. Це натхнене функцією 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/