У меня есть родитель <div>
с одним ребенком <div>
в памяти - не привязан к текущему документу. Я хочу вызвать CustomEvent
на дочерний элемент, но выслушайте это событие от родителя. Вот мой код:Почему не происходит барботирование событий в отдельных элементах DOM?
var parent = document.createElement('div');
var child = document.createElement('div');
parent.appendChild(child);
parent.addEventListener('boom', function(event) {
console.log('parent listener', event); // <~ This never runs!
});
var event = new CustomEvent('boom', { bubbles: true });
child.dispatchEvent(event);
Этот код не работает должным образом. Слушатель событий родителя никогда не срабатывает. Это, похоже, противоречит системе событий JavaScript, в результате которой события выходят из цели. Однако, если я изменить две последние строки этого фрагмента в следующих случаях обратного вызова срабатывает, как я бы ожидать, что это:
document.body.appendChild(parent);
child.dispatchEvent(event);
Другими словами, если я прилагаю мой фрагмент в качестве поддерева документа перед отправкой событие, то прослушиватель родительского события срабатывает точно так, как ожидалось. Зачем? Есть ли способ разрешить пузырение при использовании отдельных элементов DOM?
Я не вижу виртуального DOM здесь, виртуальный DOM обычно означает DOM, который на самом деле не DOM - ваш DOM здесь очень реальный, просто отсоединенный. –
Кроме того, вот решение https://medium.com/@webprolific/bubbling-events-in-detached-dom-trees-35c34b551723, если это решит проблему, напишите ответ для будущих посетителей :) –
@RobG это объектная модель документа, она представляет, как вы взаимодействуете с документами через API-интерфейс объекта, элемент с дочерним элементом, безусловно, является объектом, который указывает на взаимодействие с документом, а документ больше, чем просто дерево dom. AJAX и т. Д. Также являются частью DOM API, а также являются веб-мастерами. –