Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.09.2022, 17:34
Аспирант
Отправить личное сообщение для Andy_kun Посмотреть профиль Найти все сообщения от Andy_kun
 
Регистрация: 05.08.2022
Сообщений: 64

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 - по идее удаляю все событияс элемента.
Ответить с цитированием
  #2 (permalink)  
Старый 13.09.2022, 18:41
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,712

У вас куча прослушивателей. Для каждого события свой прослушиватель.
А удалить вы пытаетесь у всех событий только тот прослушиватель, который сработал
Ответить с цитированием
  #3 (permalink)  
Старый 13.09.2022, 19:23
Аспирант
Отправить личное сообщение для Andy_kun Посмотреть профиль Найти все сообщения от Andy_kun
 
Регистрация: 05.08.2022
Сообщений: 64

Сообщение от voraa Посмотреть сообщение
У вас куча прослушивателей. Для каждого события свой прослушиватель.
А удалить вы пытаетесь у всех событий только тот прослушиватель, который сработал
А как получить доступ ко всем прослушивателям ? Их надо как то заранее сохранить в массив ?
Ответить с цитированием
  #4 (permalink)  
Старый 13.09.2022, 20:02
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,712

Сообщение от Andy_kun
А как получить доступ ко всем прослушивателям ?
Можно и так.
А вы именно этого хотите? Навешать на все возможные события свои прослушиватели (на каждое событие свой), и как только случится первое событие (любое) снять их все?
Ответить с цитированием
  #5 (permalink)  
Старый 13.09.2022, 20:08
Аспирант
Отправить личное сообщение для Andy_kun Посмотреть профиль Найти все сообщения от Andy_kun
 
Регистрация: 05.08.2022
Сообщений: 64

Сообщение от voraa Посмотреть сообщение
Можно и так.
А вы именно этого хотите? Навешать на все возможные события свои прослушиватели (на каждое событие свой), и как только случится первое событие (любое) снять их все?
В произвольный момент времени - возможно в первое срабатывание или в другое - в зависимости от наступления нужного условия.
Ответить с цитированием
  #6 (permalink)  
Старый 14.09.2022, 13:15
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,503

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

И используй camelCase бога ради, глаза кровоточат.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 14.09.2022, 13:46
Аспирант
Отправить личное сообщение для Andy_kun Посмотреть профиль Найти все сообщения от Andy_kun
 
Регистрация: 05.08.2022
Сообщений: 64

Спасибо!
Ответить с цитированием
  #8 (permalink)  
Старый 14.09.2022, 14:04
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,712

Вот так можно без всякого массива
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 } // снять обработчик, когда придет сигнал от контролера.
          ); 
         }
     }

Последний раз редактировалось voraa, 14.09.2022 в 14:21.
Ответить с цитированием
  #9 (permalink)  
Старый 14.09.2022, 17:09
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,503

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); 
  }
}
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 14.09.2022, 18:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

Aetae,
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите сделать костыль scrollspy для всех страниц сайта пожалуйста panikajo Общие вопросы Javascript 0 04.05.2018 11:53
Проблема с делегированием событий. Валидация инпута + крестик для его очистки h0x Events/DOM/Window 0 21.05.2014 10:04
Программный вызов событий для конкретных элементов iNfantry jQuery 9 31.01.2012 15:21
Пошаговый вывод скрипта для IE всех версий. Zidky Элементы интерфейса 10 17.06.2009 18:27
Как присвоить текст строке состояния для всех браузеров? Tend Общие вопросы Javascript 4 14.05.2009 16:38