Задать вопрос
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();
        }
    }
};
  • Вопрос задан
  • 1279 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик расширенный
    13 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 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, это другой экземпляр, отличный от того, который был создан при добавлении.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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