Задать вопрос

Как правильно отменить 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
  • Вопрос задан
  • 162 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript + ИИ
    11 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Инженер по тестированию
    6 месяцев
    Далее
Решения вопроса 1
https://jsfiddle.net/09fxnwk8/2/

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

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

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