* Это было отредактировано, чтобы позволить детям целевого класса вызывать события. Смотрите в нижней части ответа для деталей. *
Альтернативный ответ для добавления прослушивателя событий в класс, где элементы часто добавляются и удаляются. Это вдохновлено onфункцией jQuery, где вы можете передать селектор для дочернего элемента, который прослушивает событие.
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
}
});
Скрипка: 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);
}
});
}
================================================
РЕДАКТИРОВАТЬ: Этот пост первоначально использовал matchesфункцию для Элементы DOM на цели события, но это ограничивало цели событий только прямым классом. Он был обновлен для использования closestфункции вместо этого, что позволяет событиям дочернего класса желаемого класса также инициировать события. Оригинальный matchesкод можно найти на оригинальной скрипке:
https://jsfiddle.net/u6oje7af/23/