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 - по идее удаляю все событияс элемента. |
У вас куча прослушивателей. Для каждого события свой прослушиватель.
А удалить вы пытаетесь у всех событий только тот прослушиватель, который сработал |
Цитата:
|
Цитата:
А вы именно этого хотите? Навешать на все возможные события свои прослушиватели (на каждое событие свой), и как только случится первое событие (любое) снять их все? |
Цитата:
|
Да, каждый навешанный сохраняй в массив, а потом все циклом снимай.
И используй camelCase бога ради, глаза кровоточат. |
Спасибо!
|
Вот так можно без всякого массива
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, совсем свежая фича, удобно.)
Чуть облагородил код: 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); } } |
Aetae,
:thanks: |
Часовой пояс GMT +3, время: 02:39. |