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, время: 01:54. |