Задать вопрос
Bulldozer323
@Bulldozer323
Fontend-разработчик

Почему не работает removeEventListener?

Перечитал много топиков на эту тему, но не могу понять почему не убирается обработчик с элемента. Данный скрипт рассчитан на блокировку фокуса табом на элементе с последующим возвращением в исходное состояние.

document.addEventListener('click', (e) => {
    let target = e.target,
        open = target.dataset.open ? target.dataset.open : 0,
        close = target.dataset.close ? target.dataset.close : 0,
        element = open || close ? document.querySelector(`[data-window=${open || close}]`) : 0,
        focused = trapFocus.bind(null, element);

    if (open) {
        element.classList.add(`${element.dataset.window}-open`);
        element.addEventListener('keydown', focused);
    }
    
    if (close) {
        element.classList.remove(`${element.dataset.window}-open`);
        element.removeEventListener('keydown', focused);
    }
});

const trapFocus = (element, event) => {
    let focusableElement = element.querySelectorAll('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])'),
        firstFocusableElement = focusableElement[0],
        lastFocusableElement = focusableElement[focusableElement.length - 1];

    if (!(event.key === 'Tab' || event.keyCode === 9)) { return; }

    if (event.shiftKey) {
        if (document.activeElement === firstFocusableElement) {
            lastFocusableElement.focus();
            event.preventDefault();
        }
    } else {
        if (document.activeElement === lastFocusableElement) {
            firstFocusableElement.focus();
            event.preventDefault();
        }
    }
};
  • Вопрос задан
  • 1244 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
Xuxicheta
@Xuxicheta
инженер
const focusedCallbacks = new WeakMap();
document.addEventListener('click', (e) => {
    let target = e.target,
        open = target.dataset.open ? target.dataset.open : 0,
        close = target.dataset.close ? target.dataset.close : 0,
        element = open || close ? document.querySelector(`[data-window=${open || close}]`) : 0,
        

    if (open) {
        element.classList.add(`${element.dataset.window}-open`);
        focusedCallback.set(element,trapFocus.bind(null, element));
        element.addEventListener('keydown', focusedCallback.get(element));
    }
    
    if (close) {
        element.classList.remove(`${element.dataset.window}-open`);
        element.removeEventListener('keydown', focusedCallback.get(element));
        focusedCallback.delete(element);
    }
});
Ответ написан
Stalker_RED
@Stalker_RED
потому что тот focused, который вы передаете при попытке снять listener, это другой экземпляр, отличный от того, который был создан при добавлении.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
02 февр. 2025, в 12:33
3000 руб./за проект
02 февр. 2025, в 12:27
5000 руб./за проект
02 февр. 2025, в 11:35
3000 руб./за проект