超时 jQuery 效果

我试图有一个元素淡入,然后在5000毫秒淡出再次出来。我知道我可以这样做:

setTimeout(function () { $(".notice").fadeOut(); }, 5000);

但这只会控制淡出,我会添加上述回调?

299485 次浏览

I just figured it out below:

$(".notice")
.fadeIn( function()
{
setTimeout( function()
{
$(".notice").fadeOut("fast");
}, 2000);
});

I will keep the post for other users!

You can do something like this:

$('.notice')
.fadeIn()
.animate({opacity: '+=0'}, 2000)   // Does nothing for 2000ms
.fadeOut('fast');

Sadly, you can't just do .animate({}, 2000) -- I think this is a bug, and will report it.

Update: As of jQuery 1.4 you can use the .delay( n ) method. http://api.jquery.com/delay/

$('.notice').fadeIn().delay(2000).fadeOut('slow');

Note: $.show() and $.hide() by default are not queued, so if you want to use $.delay() with them, you need to configure them that way:

$('.notice')
.show({duration: 0, queue: true})
.delay(2000)
.hide({duration: 0, queue: true});

You could possibly use the Queue syntax, this might work:

jQuery(function($){


var e = $('.notice');
e.fadeIn();
e.queue(function(){
setTimeout(function(){
e.dequeue();
}, 2000 );
});
e.fadeOut('fast');


});

or you could be really ingenious and make a jQuery function to do it.

(function($){


jQuery.fn.idle = function(time)
{
var o = $(this);
o.queue(function()
{
setTimeout(function()
{
o.dequeue();
}, time);
});
};
})(jQuery);

which would ( in theory , working on memory here ) permit you do to this:

$('.notice').fadeIn().idle(2000).fadeOut('slow');

To be able to use it like that, you need to return this. Without the return, fadeOut('slow'), will not get an object to perform that operation on.

I.e.:

  $.fn.idle = function(time)
{
var o = $(this);
o.queue(function()
{
setTimeout(function()
{
o.dequeue();
}, time);
});
return this;              //****
}

Then do this:

$('.notice').fadeIn().idle(2000).fadeOut('slow');

Ben Alman wrote a sweet plugin for jQuery called doTimeout. It has a lot of nice features!

Check it out here: jQuery doTimeout: Like setTimeout, but better.

Great hack by @strager. Implement it into jQuery like this:

jQuery.fn.wait = function (MiliSeconds) {
$(this).animate({ opacity: '+=0' }, MiliSeconds);
return this;
}

And then use it as:

$('.notice').fadeIn().wait(2000).fadeOut('slow');

This can be done with only a few lines of jQuery:

$(function(){
// make sure img is hidden - fade in
$('img').hide().fadeIn(2000);


// after 5 second timeout - fade out
setTimeout(function(){$('img').fadeOut(2000);}, 5000);
});​

see the fiddle below for a working example...

http://jsfiddle.net/eNxuJ/78/