Поток событий (Event Flow) — это механизм распространения событий в DOM от элемента-источника до корня документа и обратно. Это фундаментальная концепция обработки событий в браузерном JavaScript, которая также имеет аналоги в Node.js через EventEmitter.
Фаза захвата (Capture Phase):
Целевая фаза (Target Phase):
Фаза всплытия (Bubble Phase):
element.addEventListener('click', handler, true); // Захват (фаза 1)
element.addEventListener('click', handler); // Всплытие (фаза 3)
Рассмотрим следующую HTML-структуру:
<div id="parent">
<button id="child">Click me</button>
</div>
document.getElementById('parent').addEventListener('click', () => {
console.log('Parent clicked (capture)', true);
}, true);
document.getElementById('child').addEventListener('click', () => {
console.log('Child clicked');
});
document.getElementById('parent').addEventListener('click', () => {
console.log('Parent clicked (bubble)');
});
При клике на кнопку вывод будет:
В Node.js концепция потока событий реализована через:
const EventEmitter = require('events');
const emitter = new EventEmitter();
// Подписываемся на событие (аналог фазы всплытия)
emitter.on('event', () => {
console.log('Event occurred');
});
// Инициируем событие
emitter.emit('event');
event.stopPropagation(); // Прекращает движение события дальше
event.stopImmediatePropagation(); // + предотвращает вызов других обработчиков
event.preventDefault();
Поток событий — это механизм распространения и обработки событий, который в браузерах проходит три фазы (захват, цель, всплытие), а в Node.js реализован через EventEmitter. Понимание этого механизма критически важно для эффективной работы с событиями в JavaScript-приложениях.