* Это было отредактировано, чтобы позволить детям целевого класса вызывать события. Смотрите в нижней части ответа для деталей. *
Альтернативный ответ для добавления прослушивателя событий в класс, где элементы часто добавляются и удаляются. Это вдохновлено 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/