Перечитал много топиков на эту тему, но не могу понять почему не убирается обработчик с элемента. Данный скрипт рассчитан на блокировку фокуса табом на элементе с последующим возвращением в исходное состояние.
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();
}
}
};