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();
        }
    }
};
  • Вопрос задан
  • 1232 просмотра
Решения вопроса 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, это другой экземпляр, отличный от того, который был создан при добавлении.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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