События, которые запускаются непосредственно в Окно , не имеют " Фаза захвата ".
Если вы посмотрите на Диспетчеризацию событий и поток событий DOM graphi c, вы увидите, что этот поток начинается в Window , и, таким образом, такие события уже будут быть в " Target Phase " с первого шага.
Это означает, что на таких событиях флаг capture
бесполезен, потому что все слушатели событий будут срабатывать в " Целевая фаза"в любом случае, поэтому вы не можете остановить распространение события на ранее установленные обработчики , так как они сработают до вашего обработчика захвата.
const phases_dict = {
[Event.CAPTURING_PHASE]: 'Capturing Phase',
[Event.AT_TARGET]: 'Target Phase',
[Event.BUBBLING_PHASE]: 'Bubbling Phase'
};
// First listener defined without capturing flag, will fire first anyway
window.addEventListener( 'blur', evt => {
const current_phase = phases_dict[ evt.eventPhase ];
console.log( 'bubble blur is in', current_phase );
}, { capture: false } ); // fire at bubbling phase
// Second listener with capturing flag
window.addEventListener( 'blur', evt => {
// This one will also capture the events on Elements in the Document
// For our case, we only want the one on Window
if( evt.currentTarget === evt.target ) {
const current_phase = phases_dict[ evt.eventPhase ];
console.log( 'capture blur is in', current_phase );
}
}, { capture: true } ); // fire at capturing phase
// To show that bubbling events work as intended
// We also register click events
window.addEventListener( 'click', evt => {
const current_phase = phases_dict[ evt.eventPhase ];
console.log( 'bubble click is in', current_phase );
}, { capture: false } ); // fire at bubbling phase
window.addEventListener( 'click', evt => {
const current_phase = phases_dict[ evt.eventPhase ];
console.log( 'capture click is in', current_phase );
}, { capture: true } ); // fire at capturing phase
Click anywhere in this frame then click somewhere else in SO's page to trigger focus event
Обратите внимание, что вы можете остановить распространение элементов blur , но не Window.
Вам нужно будет найти другой способ заблокировать ваших текущих слушателей, возможно, используя переменную flag?