Определен ли где-нибудь порядок событий Bubbling и Capturing во время целевой фазы?
Практически везде, где вы смотрите, вы обнаружите, что сначала есть фаза Capturing, а затем Bubbling. В некоторых источниках дополнительно упоминается целевая фаза в качестве отдельной стадии.
Однако источники, упоминающие целевую фазу , не указывают порядок событий во время этой фазы. Я предположил, что события, зарегистрированные как Capturing, будут предшествовать событиям, зарегистрированным как Bubbling. Оказывается, это не всегда так!
На самом деле, согласно результатам моего небольшого эксперимента, выполнение обработчика событий на этапе Target зависит исключительно от порядка их регистрации.
const extBox = document.querySelector('.external-box');
const intBox = document.querySelector('.internal-box');
const par = document.querySelector('p');
extBox.addEventListener('click', bubblingEvent, false);
intBox.addEventListener('click', bubblingEvent, false);
par.addEventListener('click', bubblingEvent, false);
par.addEventListener('click', capturingEvent, true);
extBox.addEventListener('click', capturingEvent, true);
intBox.addEventListener('click', capturingEvent, true);
function bubblingEvent(event) {
console.log(event.currentTarget.className + ': bubbling event, ' + getPhaseStr(event.eventPhase));
}
function capturingEvent(event) {
console.log(event.currentTarget.className + ': capturing event, ' + getPhaseStr(event.eventPhase));
}
function getPhaseStr (eventPhase) {
let eventPhaseStr;
switch (eventPhase) {
case 0:
eventPhaseStr = 'NONE';
break;
case 1:
eventPhaseStr = 'CAPTURING_PHASE';
break;
case 2:
eventPhaseStr = 'AT_TARGET';
break;
case 3:
eventPhaseStr = 'BUBBLING_PHASE';
break;
default:
eventPhaseStr = 'ERROR';
}
return eventPhaseStr;
}
* {
box-sizing: border-box;
}
.external-box, .internal-box {
width: 50%;
margin: 1rem;
padding: 1rem;
}
.external-box {
background-color: aquamarine;
}
.internal-box {
background-color: blueviolet;
}
p {
background-color: cornsilk;
padding: 1rem;
}
<div class='external-box'>external-box
<div class='internal-box'>internal-box
<p class='par'>paragraph</p>
</div>
</div>
В приведенном выше примере мы можем видеть, что - в течение целевой фазы - событие, добавленное для фазы пузырьков, выполняется до Фаза захвата. Это потому, что я сначала зарегистрировал события для фазы Bubbling. Если я сначала зарегистрирую события для фазы Capturing, а затем Bubbling, порядок будет «правильным».
Мой вопрос еще раз: определен ли где-нибудь порядок событий во время целевой фазы?