Странная проблема setTimeout - PullRequest
0 голосов
/ 15 марта 2012

У меня есть эта проблема.Я определил функцию для удаления ссылки (просто для примера), поэтому я хочу, чтобы после события mouseleave на ссылку она исчезла через 5 секунд (или что-то еще).Кроме того, если я наведу указатель мыши на ту же ссылку (на которой якобы запущен setTimeout), этот setTimeout отменяется.Например, следующий код работает, но так как я не определяю свой setTimeout, я не могу отменить его.

function func() { $('a').remove(); }
    //var interval = setTimeout( func , 5000);

    $('body').on('mouseleave', 'a', function() {
        setTimeout( func , 5000);
    });

    $('body').on('mouseenter', 'a', function(){
    //    clearTimeout(interval)
    });

Вместо этого, раскомментируя вторую строку, ссылка немедленно исчезает, даже если я 'используя функцию func без скобок, поэтому я подумал бы, что это не будет проблемой ( fiddle ):

function func() { $('a').remove(); }
    var interval = setTimeout( func , 5000);

    $('body').on('mouseleave', 'a', function() {
        interval
    });

    $('body').on('mouseenter', 'a', function(){
    //    clearTimeout(interval)
    });

Что я могу сделать, чтобы достичь намеченной функциональности?.

Спасибо!

1 Ответ

2 голосов
/ 15 марта 2012

Вам нужно объединить (да, это технический термин) ваши две попытки. Объявите interval вне func и обработчиков мыши, чтобы на него могли ссылаться оба обработчика.

function func() {
    $('a').remove();
}

var interval;

$('body').on('mouseleave', 'a', function() {
    interval = setTimeout(func, 5000);
});

$('body').on('mouseenter', 'a', function() {
    clearTimeout(interval);
});​

http://jsfiddle.net/mattball/2XN9a/

...