setTimeout и clearTimeout

235
24 сентября 2018, 02:20

При наведении на div c меню, фон вокруг затемняется, но если проводить так много раз, mouseenter & mouseleave из дива, начинает моргать. Решил установить setTimeout, получилось так:

$(".subcat > ul").hover(function(){
    var time_id = setTimeout(function () {
        $(".subcat").css({ zIndex: 15 });
        $(".subcat_overlay").fadeIn();
    }, 1000);       
}, function(){
        $(".subcat").css({ zIndex: 1 });
        $(".subcat_overlay").fadeOut();
});

Проблема сейчас в том, что нужна переменная, очищающая время, clearTimeout(time_id); Но куда её воткнуть, я что-то не понимаю.

Answer 1

Как подсказал @Regent, Вам следует вынести ссылку на таймер в глобальное пространство, чтобы можно было обращаться к нему после окончания блока кода. А перед созданием нового таймера проверяйте наличие ранее созданных экземпляров – в этом случае удаляйте их.

var time_id = null;
$(".subcat > ul").hover(function(){
    if (time_id) {
        clearTimeout(time_id);
    }
    // убран var – иначе будет создаваться локальная переменная 
    time_id = setTimeout(function () {
        $(".subcat").css({ zIndex: 15 });
        $(".subcat_overlay").fadeIn();
    }, 1000);       
}, function() {
        $(".subcat").css({ zIndex: 1 });
        $(".subcat_overlay").fadeOut();
});
Answer 2

Fade-функциии ставятся в очередь, не прервывая предыдущих. Решение - stop

$(".subcat_overlay").stop().fadeIn()
$(".subcat_overlay").stop().fadeOut()

Либо вообще без таймаутов

$(".subcat_overlay").stop().fadeOut().delay(1000).fadeIn()
Answer 3

Вы можете написать в стиле

.subcat_overlay{
    opacity: 0;
    transition: all .5s ease;
}
.subcat_overlay_hover{
    opacity: 1;
}

И в JS

$(".subcat > ul").hover(function(){
    $(".subcat").css({ zIndex: 15 });
    $(".subcat_overlay").addClass('.subcat_overlay_hover');       
}, function(){
    $(".subcat").css({ zIndex: 1 });
    $(".subcat_overlay").removeClass('.subcat_overlay_hover');
});

Или же так (не уверен, что будет работать. Сделал увидев комментарий)

var time_id;
$(".subcat > ul").hover(function(){
    clearTimeout(time_id);
    time_id = setTimeout(function () {
        $(".subcat").css({ zIndex: 15 });
        $(".subcat_overlay").fadeIn();
    }, 1000);       
}, function(){
    $(".subcat").css({ zIndex: 1 });
    $(".subcat_overlay").fadeOut();
});
READ ALSO
Как сделать что бы iframe не грузился сразу?

Как сделать что бы iframe не грузился сразу?

Есть три таба в каждом будет ифрейм и надо что бы при нажатии они прогружались а не сразу при входе на сайт Возможно ли это?

226
jQuery сброс нажатия на ползунок

jQuery сброс нажатия на ползунок

помогите решить проблему, есть некий бустрап слайдер

264
как найти прошедшие ивенты в bootstrap year calendar

как найти прошедшие ивенты в bootstrap year calendar

для своего проэкта я использую плагие bootstrap year calendarКак можно найти прошедшие ивенты и применить например к ячейкам этого ивента какойто цвет

270