@safo4eg

Как отвязать событие от document?

let wrapperItems = document.querySelectorAll('.wrapper div');
let years = document.querySelector('#years');
let yearsList = years.firstElementChild;

let arrayCounters = [0, 0, 0];
let counter = 0;

function activateListItem() {
    ;(function hideRestItems() {
        wrapperItems.forEach((elem, item) => {
            if(elem != this) {
                elem.style.overflow = 'hidden';
            }
        });
    })();
    
    let obj = this;
    this.style.overflow = 'visible';
        
    document.addEventListener('keydown', changeListItem); // ВОТ ЭТО!
        
    function changeListItem(event) {
        wrapperItems.forEach(function(elem, index) {
           if(elem == obj) {
               counter = arrayCounters[index];
           } 
        });
        
        if(event.code === 'ArrowUp') {
            counter += -20;
            obj.firstElementChild.style.top = `${counter}px`;
        } else if (event.code === 'ArrowDown') {
            counter += 20;
            obj.firstElementChild.style.top = `${counter}px`;
        }
         
        wrapperItems.forEach((elem, index) => {
            if(elem == obj) {
                arrayCounters[index] = counter;
            }
        });
    }
}

wrapperItems.forEach((elem) => {
   elem.addEventListener('click', activateListItem); 
});


Суть такая: есть три списка, при клике на любой из них overflow: hidden; и могу с помощью стрелочек листать этот список, но при клике на, допустим другой, и если начинаю его листать, то предыдущий тоже листается, как это убрать? Пытался отвязать во всех местах кода этот обработчик(подписан "вот это") и во время проверки != элемент, который сейчас повешан обработчик основнов

codepen(кликните на первое, потом на второе и попробуйте полистать с помощью стрелочек вверх - вниз):
https://codepen.io/Safo4eg/full/BarZOWK

Буду благодарен даже не решению, а материалу, который подробней мне нужно изучить (повторить), чтобы справиться с этим
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
@safo4eg Автор вопроса
Поставленную проблему решил путем обьявления переменной obj, к которой присваиваю this дабы решить проблему потери контекста, глобальной переменно. Тогда работает всё корректно, не понимаю, почему так?

На ум приходит только, что при каждом клике на список в событии keydown обьекта document создаётся своя локальная obj и потом событие обьекта document применяется ко всем этим obj, а если обьявляю глобально, то она постоянно меняется и применяется лишь к одной? Это лишь мои догадки, знаний не хватает, может кто-нибудь обьяснить что там на самом деле и как? голова уже кипит
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Ivan1331
wrapperItems.forEach((elem, index) => {
            if(elem == obj) {
                arrayCounters[index] = counter;
                counter=0; // Вы забыли обнулить counter после каждого изменения
            }
        });
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
23 нояб. 2024, в 01:31
1000 руб./за проект
23 нояб. 2024, в 00:16
2000 руб./за проект