Как правильно отменить SetTimeOut?

При наведении на блок, появляется дочерний блок, после того, как курсор покинет пределы блока, дочерний скрывается. Если курсор случайно вышел за пределы блока, есть 3 секунды, чтобы вернуть его обратно и отменить скрытие. Для этого при повторном наведении должен отменяться таймаут, но отмены не происходит. Что не так в коде ниже?
let timerVolume = null;
document.querySelector('.volume').addEventListener('mouseenter', (e) => {
        if(timerVolume) {
            clearTimeout(timerVolume);
        }
        volumeBar.style.display = 'block';
document.querySelector('.volume').addEventListener('mouseleave', () => {
            timerVolume = setTimeout(() => {
                volumeBar.style.display = 'none';
            }, 3000);
        })

UPD: Консоль показала, что код внутри обработчика mouseleave выполняется несколько раз. Вешается два таймаута при втором mouseleave, три при третьем, четыре при четвертом... Если до этого момента ещё были надежды найти решение самому, то сейчас я вообще не понимаю каким образом это работает.
document.querySelector('.volume').addEventListener('mouseenter', (e) => {
        if(timerVolume) {
            clearTimeout(timerVolume);
            console.log('delete', timerVolume);
        }
        volumeBar.style.display = 'block';
document.querySelector('.volume').addEventListener('mouseleave', () => {
            timerVolume = setTimeout(() => {
                volumeBar.style.display = 'none';
                console.log('work ' + timerVolume);
            }, 3000);
                console.log('start', timerVolume);
        })

Вывод консоли:
start 1
work 1
delete 1
start 2
start 3
delete 3
start 4
start 5
start 6
4 work 6
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
https://jsfiddle.net/09fxnwk8/2/

Зачем вы вешаете обработчик события в обработчике события?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы