Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   removeEventListener - для всех событий (https://javascript.ru/forum/events/84450-removeeventlistener-dlya-vsekh-sobytijj.html)

Andy_kun 13.09.2022 17:34

removeEventListener - для всех событий
 
Извините, подскажите пожалуйста, вот есть такой код:


function my_func_addAllEventListeners_callback(element_for_eventlistener)   
{
    return function my_func_event(event) 
    {
               console.log("my_func_event");
               for (const key in element_for_eventlistener) 
               {

                   if(key.startsWith('on'))
                   {
                     element_for_eventlistener.removeEventListener(key.slice(2), my_func_event); 
                   } 

               }
         
    }
}
    


//---------------------------------------------------------------------------------


    
let element_for_eventlistener = document;   

    
 for (const key in element_for_eventlistener) 
     {

         if(key.startsWith('on'))
         {
        element_for_eventlistener.addEventListener(key.slice(2), my_func_addAllEventListeners_callback(element_for_eventlistener));  
         } 
     }


То есть я запускаю прослушиватель на всех событий и сразу же после первого срабатывания - я их пытаюсь удалить, НО callback все равно срабатывает более одного раза.

Не могу понять почему ? Ведь я же в первый вызов callback - по идее удаляю все событияс элемента.

voraa 13.09.2022 18:41

У вас куча прослушивателей. Для каждого события свой прослушиватель.
А удалить вы пытаетесь у всех событий только тот прослушиватель, который сработал

Andy_kun 13.09.2022 19:23

Цитата:

Сообщение от voraa (Сообщение 547951)
У вас куча прослушивателей. Для каждого события свой прослушиватель.
А удалить вы пытаетесь у всех событий только тот прослушиватель, который сработал

А как получить доступ ко всем прослушивателям ? Их надо как то заранее сохранить в массив ?

voraa 13.09.2022 20:02

Цитата:

Сообщение от Andy_kun
А как получить доступ ко всем прослушивателям ?

Можно и так.
А вы именно этого хотите? Навешать на все возможные события свои прослушиватели (на каждое событие свой), и как только случится первое событие (любое) снять их все?

Andy_kun 13.09.2022 20:08

Цитата:

Сообщение от voraa (Сообщение 547954)
Можно и так.
А вы именно этого хотите? Навешать на все возможные события свои прослушиватели (на каждое событие свой), и как только случится первое событие (любое) снять их все?

В произвольный момент времени - возможно в первое срабатывание или в другое - в зависимости от наступления нужного условия.

Aetae 14.09.2022 13:15

Да, каждый навешанный сохраняй в массив, а потом все циклом снимай.

И используй camelCase бога ради, глаза кровоточат.

Andy_kun 14.09.2022 13:46

Спасибо!

voraa 14.09.2022 14:04

Вот так можно без всякого массива
function my_func_addAllEventListeners_callback(element_for_eventlistener)  
{
    return function my_func_event(event)
    {
               console.log("my_func_event");
               controller.abort()  // послать сигнал - снимаем все обработчики
     }
}
     
 
 
//---------------------------------------------------------------------------------
 
 
const controller = new AbortController();  
  
let element_for_eventlistener = document;  
 
     
 for (const key in element_for_eventlistener)
     {
 
         if(key.startsWith('on'))
         {
        element_for_eventlistener.addEventListener(
                key.slice(2), 
                my_func_addAllEventListeners_callback(element_for_eventlistener),
               { signal: controller.signal } // снять обработчик, когда придет сигнал от контролера.
          ); 
         }
     }

Aetae 14.09.2022 17:09

voraa, совсем свежая фича, удобно.)

Чуть облагородил код:
const controller = new AbortController();  

function addAllEventListenersCallback(event) {
  console.log("my_func_event", event.type, event.target);
  controller.abort()  // послать сигнал - снимаем все обработчики
}

let elementForEventlistener = document;  

for (const key in elementForEventlistener) {
  if (key.startsWith('on')) {
    elementForEventlistener.addEventListener(key.slice(2), addAllEventListenersCallback, controller); 
  }
}

рони 14.09.2022 18:22

Aetae,
:thanks:


Часовой пояс GMT +3, время: 00:36.