Как бы я заблокировал или подделал слушателя событий размытия? - PullRequest
0 голосов
/ 14 апреля 2020

Я уже собрал небольшой скрипт веб-консоли, который работал на одном сайте, но, похоже, не работает на другом. Я думаю, что мне действительно интересно, есть ли более эффективный способ go сделать это.

window.addEventListener("blur", function(event) { 
	event.stopPropagation();
}, true);

1 Ответ

0 голосов
/ 14 апреля 2020

События, которые запускаются непосредственно в Окно , не имеют " Фаза захвата ".

Если вы посмотрите на Диспетчеризацию событий и поток событий 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?

...