Насколько я понимаю, обработка событий DOM Level 2 работает в следующем порядке:
- захват от верхнего HTML-элемента до цели
- сама цель
- всплывающее всплывающее окно до верхнего HTML-элемента
пример находится по адресу: https://jsfiddle.net/uwe5dmxw/
(я включу код в конец этого вопроса)
Но если я нажму на «дочерний» элемент (потомок самого низкого уровня) в текущем Google Chrome, Firefox, Safari и даже в IE 11, я получу последовательный результат в следующем порядке:
- Захват HTML
- ТЕЛО захват
- Родительский захват
- цель пузырящаяся
- захват цели
- Родитель пузырится
- ТЕЛО пузырится
- HTML всплывающее окно
То есть порядок «захвата цели» и «пузырька цели» обратный.
Насколько я понял, хотя упомянутое событие DOM уровня 2 достигает цели только один раз, но большинство браузеров реализуют его как достижение цели дважды, один раз во время захвата события и один раз во время всплытия события. Но дело в том, почему "захват цели" и "бульканье цели" поменяны местами?
Код: (но только демо, без необходимости смотреть не надо)
<div id="hi">
hello
<div id="child">
child
</div>
</div>
JavaScript:
var parentElement = document.getElementById("hi"),
childElement = document.getElementById("child"),
htmlElement = document.getElementsByTagName("html")[0],
bodyElement = document.getElementsByTagName("body")[0];
// ------------------ Bubble --------------------
htmlElement.addEventListener("click", function() {
console.log("<html> clicked " + new Date().getTime(), this);
});
bodyElement.addEventListener("click", function() {
console.log("<body> clicked " + new Date().getTime(), this);
});
parentElement.addEventListener("click", function() {
console.log("Parent clicked " + new Date().getTime(), this);
});
childElement.addEventListener("click", function() {
console.log("Child clicked at " + new Date().getTime(), this);
});
// ------------------ Use Capture --------------------
htmlElement.addEventListener("click", function() {
console.log("<html> (useCapture) clicked " + new Date().getTime(), this);
}, true);
bodyElement.addEventListener("click", function() {
console.log("<body> (useCapture) clicked " + new Date().getTime(), this);
}, true);
parentElement.addEventListener("click", function() {
console.log("Parent (useCapture) clicked " + new Date().getTime(), this);
}, true);
childElement.addEventListener("click", function() {
console.log("Child (useCapture) clicked at " + new Date().getTime(), this);
}, true);