2012-03-15 2 views
0

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

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) 
    }); 

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

Спасибо!

ответ

2

Вам необходимо комбинировать (да, это технический термин) ваши две попытки. Объявите 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/

+0

Brilliant :-). Спасибо, он работает безупречно. –

+2

Yup. Вы были так близки! Вы должны попытаться заглянуть в свой отладчик, чтобы узнать, что происходит в следующий раз. –

+0

Я использовал console.log совсем немного, но мне не приходило в голову определить «интервал» снаружи и с использованием interval = setTimeout внутри функции mouseleave. –