Захват событий — это первая фаза распространения событий в DOM, при которой событие движется от корневого элемента (window) вниз по иерархии DOM-дерева до целевого элемента. Это противоположность всплытию (bubbling) и важная часть полного цикла события.
<div id="grandparent">
<div id="parent">
<button id="child">Click me</button>
</div>
</div>
document.getElementById('grandparent').addEventListener('click', () => {
console.log('Grandparent capture');
}, true); // Обратите внимание на третий параметр
document.getElementById('parent').addEventListener('click', () => {
console.log('Parent capture');
}, true);
document.getElementById('child').addEventListener('click', () => {
console.log('Child target');
});
При клике на кнопку вывод будет:
true
в addEventListenerdocument.addEventListener('click', (e) => {
if (e.target.tagName === 'A') {
console.log('Link will be clicked');
// Можно модифицировать поведение до достижения ссылки
}
}, true);
// Перехват всех кликов внутри модального окна
modal.addEventListener('click', trackUserActions, true);
form.addEventListener('submit', validateBeforeReachSubmitButton, true);
event.stopPropagation(); // Прекращает и захват, и всплытие
element.addEventListener('click', captureHandler, true); // Захват
element.addEventListener('click', bubbleHandler); // Всплытие
Хотя в Node.js нет DOM, аналогичная концепция существует:
emitter.prependListener('event', () => {
console.log('Этот обработчик сработает первым');
});
Захват событий — это мощный, хотя и редко используемый механизм, позволяющий перехватывать события на ранних стадиях их распространения. Понимание этой фазы необходимо для полного контроля над обработкой событий в сложных веб-приложениях и создания продвинутых паттернов взаимодействия.