Первый из document.querySelector
метод вернет null
, если элемент отсутствует в DOM. Вы не можете вызвать addEventListener
по нулю. В jQuery
это сработало, потому что jquery создает отдельный объект (называемый jQuery объектом). Объект jQuery выглядит примерно так:
{
0: {...} // HTMLElement reference
length: 1
} // jQuery object
Этот объект предоставляет jQuery API, который имеет on
метод обработки событий (доступный независимо от наличия фактического элемента DOM). В этом прелесть jQuery (и недостаток).
Метод селектора запросов, с другой стороны, возвращает HTMLElement
. Если элемент отсутствует в DOM, возвращается null
.
Теперь, предполагая, что элемент появится в DOM через определенное время, вы можете сделать две вещи:
- Подождите, пока элемент появится в DOM, и как только он станет доступным, добавьте функцию прослушивания.
- Используйте
live
события (делегирование событий) в JavaScript.
Я покажу вам второй подход:
setTimeout(() => {
document.querySelector('#container').innerHTML = `<button id="btn">Click</button>`;
}, 3000);
document.addEventListener('click', (e) => {
if (e.target.id === 'btn') {
alert('Click works!');
}
});
<div id="container">
A button will appear after 3 seconds. However, click event would still work.
</div>
Как видите, я использую e.target
, чтобы определить, какой элемент я щелкнул внутри документа (к которому я прикрепил слушателя). Как только условие совпадает, запускается alert
. Это позволяет нам связывать события для элементов, которые изначально не присутствуют в DOM.