Я прочитал статью на https://developer.mozilla.org/en/DOM/element.addEventListener, но не смог понять useCapture
атрибут. Определение есть:
Если true, useCapture указывает, что пользователь желает инициировать захват. После инициирования захвата все события указанного типа будут отправлены зарегистрированному слушателю перед отправкой в любые EventTargets под ним в дереве DOM. События, которые поднимаются вверх по дереву, не вызовут слушателя, предназначенного для использования захвата.
В этом коде родительское событие инициируется перед дочерним, поэтому я не могу понять его поведение. Объект документа имеет usecapture true, а дочерний div имеет usecapture, установленный в false, и документ usecapture следует. Поэтому свойство документа предпочтительнее, чем child.
function load() {
document.addEventListener("click", function() {
alert("parent event");
}, true);
document.getElementById("div1").addEventListener("click", function() {
alert("child event");
}, false);
}
<body onload="load()">
<div id="div1">click me</div>
</body>
источник
no specification is made as to the order in which they will receive the event with regards to the other EventListeners on the EventTarget
. Я не тестировал все браузеры, поэтому все они могут реализовать его одинаково. Однако события захвата будут выполняться до событий без захвата.Я считаю, что эта диаграмма очень полезна для понимания фаз захвата / цели / пузыря: http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
Ниже содержание извлечено по ссылке.
Этапы
Событие отправляется по пути от корня дерева до этого целевого узла. Затем он может обрабатываться локально на уровне целевого узла или от любых предков цели выше в дереве. Диспетчеризация событий (также называемая распространением событий) происходит в три этапа и в следующем порядке:
Предки цели определяются до первоначальной отправки события. Если целевой узел удаляется во время диспетчеризации, или предок цели добавляется или удаляется, распространение события всегда будет основываться на целевом узле и предках цели, определенных до отправки.
Некоторые события могут не обязательно выполнять три фазы потока событий DOM, например, событие может быть определено только для одной или двух фаз. В качестве примера, события, определенные в этой спецификации, всегда будут выполнять фазы захвата и назначения, но некоторые не будут завершать фазу пузырьков («события пузырьков» по сравнению с «событиями не пузырьков», см. Также атрибут Event.bubbles).
источник
Window
, а неdocument
потому, чтоdocument
является потомкомWindow
?Событие захвата (
useCapture = true
) и событие пузыря (useCapture = false
)Ссылка MDN
useCapture
параметр не имеет значения (спасибо @bam и @ legend80s)stopPropagation()
остановит потокдемонстрация
Результат:
Целевой пузырь 1
(Поскольку Capture и Bubble of Target будут срабатывать в том порядке, в котором они были зарегистрированы, поэтому событие Bubble запускается до события Capture)
Захват цели
источник
Events in the target phase will trigger all listeners on an element in the order they were registered, regardless of the useCapture parameter.
От developer.mozilla.org/en-US/docs/Web/API/EventTarget/… . Таким образом, не существует фазы «Детский захват» и «Детский пузырь».Когда вы говорите useCapture = true, события выполняются сверху вниз в фазе захвата, когда ложь, это делает пузырь снизу вверх.
источник
Это все о моделях событий: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow Вы можете поймать событие в фазе пузырьков или в фазе захвата. Твой выбор.
Взгляните на http://www.quirksmode.org/js/events_order.html - вы найдете это очень полезным.
источник
Пример кода:
Javascript код:
если оба установлены в false
Выполняет: при нажатии Inner Div, предупреждения отображаются как: Div 2> Div 1
Здесь скрипт выполняется из внутреннего элемента: Event Bubbling (useCapture было установлено в false)
для div 1 установлено значение true, для div 2 установлено значение false
Выполняет: при нажатии Inner Div, предупреждения отображаются как: Div 1> Div 2
Здесь скрипт выполняется из предка / внешнего элемента: Захват событий (useCapture было установлено в true)
для div 1 установлено значение false, а для div 2 установлено значение true
Выполняет: при нажатии Inner Div, предупреждения отображаются как: Div 2> Div 1
Здесь скрипт выполняется из внутреннего элемента: Event Bubbling (useCapture было установлено в false)
для div 1 установлено значение true, а для div 2 установлено значение true
Выполняет: при нажатии Inner Div, предупреждения отображаются как: Div 1> Div 2
Здесь сценарий выполняется из предка / внешнего элемента: Захват событий, поскольку для useCapture установлено значение true.
источник
Резюме:
Спецификация
DOM
описана в:https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
работает следующим образом:
Событие отправляется по пути от корня (
document
) дерева к целевому узлу . Целевой узел - самый глубокийHTML
элемент, то есть event.target. Диспетчеризация событий (также называемая распространением событий) происходит в три этапа и в следующем порядке:document
) до прямого родителя целевого узла.html
элементе, на котором было отправлено событие.Пример:
Приведенный выше пример действительно иллюстрирует разницу между всплытием событий и захватом событий. При добавлении прослушивателей событий с помощью
addEventListener
существует третий элемент, называемый useCapture. Этот параметр,boolean
который при установкеtrue
позволяет прослушивателю событий использовать захват событий вместо всплытия событий.В нашем примере, когда мы устанавливаем аргумент useCapture в значение,
false
мы видим, что происходит всплытие событий. Сначала запускается событие на целевой фазе (регистрирует innerBubble), а затем с помощью пузырькового события генерируется событие в родительском элементе (регистрируется externalBubble).Когда мы устанавливаем аргумент useCapture,
true
мы видим, что событие во внешнем событии<div>
запускается первым. Это происходит потому, что событие теперь запускается в фазе захвата, а не в фазе барботирования.источник
Учитывая три этапа событийного путешествия :
useCapture
указывает на какие фазы события путешествия будут:Источник совпадает со вторым лучшим ответом: https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
источник
Порядок определения имеет значение, только если элементы находятся на одном уровне. Если вы измените порядок определения в вашем коде, вы получите те же результаты.
Однако, если вы измените настройку useCapture в двух обработчиках событий, дочерний обработчик отклика будет предшествовать родительскому обработчику. Причина этого заключается в том, что дочерний обработчик событий теперь будет запускаться на фазе захвата, которая предшествует фазе пузырьков, на которой будет запускаться родительский обработчик событий.
Если вы установите для свойства useCapture значение true для обоих обработчиков событий - независимо от порядка определения - родительский обработчик событий будет запущен первым, потому что он предшествует дочернему элементу в фазе захвата.
И наоборот, если вы установите для свойства useCapture значение false для обоих обработчиков событий - опять же, независимо от порядка определения - дочерний обработчик событий будет запущен первым, потому что он предшествует родительскому в фазе пузырьков.
источник