Задать вопрос
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();
        }
    }
};
  • Вопрос задан
  • 1275 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 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, это другой экземпляр, отличный от того, который был создан при добавлении.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы