Можно ли использовать «AbortController» в качестве функциональной альтернативы «removeEventListener»?

#javascript #dom-events

Вопрос:

Я только что узнал, что в современных браузерах можно навсегда отменить обработчики событий с помощью AbortSignal.

Вот небольшое доказательство концепции (проверьте эту ручку для демонстрации):

 let container = () => document.getElementById('container');
let cancelButton = () => document.getElementById('cancel');

function main() {  
 let controller = new AbortController();
 let signal = controller.signal;

  container().addEventListener("click", function() {
      alert("I'm being clicked!!!");
  }, {signal});
  
  cancelButton().addEventListener("click", function() {
    alert('Ha ha!!! Your yellow square event is cancelled!!!');

     controller.abort();
     container().innerText = "click me no more";
 });
}
 

Это работает. Однако в документах указывается следующее:

Интерфейс AbortController представляет объект контроллера, который позволяет прерывать один или несколько веб-запросов по мере необходимости.

Тем не менее, нигде в документации не указано, что:

  1. AbortController может быть применен к любому произвольному событию (в документе используется следующая терминология — запросы DOM, веб-запросы).
  2. Последствия его использования в точности эквивалентны вызову «removeEventListener».

Итак, мой вопрос в том, могу ли я использовать AbortController в качестве функциональной альтернативы removeEventListener ?

Ответ №1:

Согласно документам MDN ( options параметр -> > signal ) — да, вы можете использовать AbortSignal.abort() в качестве альтернативы removeEventListener , так как:

Прослушиватель будет удален при вызове метода abort() данного сигнала прерывания.

Комментарии:

1. Согласно этой статье, это относится не ко всем браузерам — css-tricks.com/…

2. @shabunc это определенно не так. AbortSignal.abort() сама по себе она не пользуется такой широкой поддержкой .