Цель
Я хочу, чтобы делегированный обработчик кликов продолжал надежно работать для динамически добавляемых элементов.
Ожидается Поведение
События кликов должны фиксироваться единообразно для всех динамически созданных кнопок с использованием делегирования событий.
Фактическое поведение
После нескольких обновлений DOM обработчик кликов молча перестает срабатывать для вновь добавленных элементов. В консоли не отображаются ошибки JavaScript, и существующие элементы могут продолжать работать.
Среда
- Ванильный JavaScript (без платформы)
- Делегирование событий через document.addEventListener
- Динамические обновления DOM
- Современные браузеры (Chrome / Firefox)
Код: Выделить всё
const container = document.getElementById("container");
document.addEventListener("click", function (e) {
if (e.target.matches(".dynamic-btn")) {
console.log("Clicked:", e.target.dataset.id);
}
});
function addButton(id) {
const btn = document.createElement("button");
btn.className = "dynamic-btn";
btn.dataset.id = id;
btn.textContent = "Button " + id;
container.appendChild(btn);
}
let count = 0;
setInterval(() => {
addButton(++count);
// Simulate DOM mutation
if (count % 5 === 0) {
container.innerHTML = container.innerHTML;
}
}, 1000);
- В DevTools ошибок и предупреждений не появляется.
- Прослушиватель событий регистрируется только один раз.
- Проблема становится более частой после переназначения внутреннегоHTML.
- Делегирование должно по-прежнему работать в соответствии с документацией
- Использование ближайших() вместо match()
- Привязка событий непосредственно к элементам
- Избежание дублирования прослушивателей
- Отладка с помощью точек останова и снимков памяти
Какое внутреннее поведение DOM или браузера приводит к тому, что делегированные обработчики событий перестают отвечать после определенных изменений DOM, например как переназначение внутреннегоHTML, даже если ошибок не возникает?
Связано ли это с:
- заменой идентификатора узла?
- Недействительностью цели события?
- Сборкой мусора ссылок DOM?
- Или другой механизм?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -mutations
Мобильная версия