delay() or timeout with stop()? delay() or timeout with stop()? jquery jquery

delay() or timeout with stop()?


You need to use setTimeout() in this case because of how .delay() works (and your inability to cancel it).

$('.file a').live('mouseenter', function() {  $.data(this, 'timer', setTimeout(function() {      $('#download').stop(true, true).fadeIn('fast');  }, 1000));}).live('mouseleave', function() {  clearTimeout($.data(this, 'timer'));  $('#download').stop(true, true).fadeOut('fast');});

You can give it a try here.

If you use .delay() it'll dequeue the next animation for the element, regardless of if you cleared that queue earlier. So you need a timeout that you can cancel, which the above does by manually calling setTimeout() and storing the result with $.data() so you can clear it later, via clearTimeout().


I was looking for the answer to a similar question, and I found that .animate() could also be used to handle this, and it obeys .stop()

It would look something like this:

$('.file a').live('mouseenter', function() {    $('#download')        .stop(true, true)        .animate({opacity:0}, 1000);            // one second delay        .animate({opacity:1}, 'fast', 'swing');}).live('mouseleave', function() {    $('#download')        .stop(true, true)        .animate({opacity:0}, 'slow', 'swing');});


Use a setTimeout function

$('.file a').live('mouseenter', function() {setTimeout(function(){    $('#download').stop(true, true).fadeIn('fast');}, 1000);}).live('mouseleave', function() {    $('#download').stop(true, true).fadeOut('fast');});

setTimeout will execute the code inside the function after the specified miliseconds (in this case 1000).