jQuery超时效果


101

我试图让某个元素淡入,然后在5000毫秒内再次淡出。我知道我可以做类似的事情:

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

但这只能控制淡出,我可以在回调中添加以上内容吗?

Answers:


197

更新:从jQuery 1.4开始,您可以使用.delay( n )方法。http://api.jquery.com/delay/

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

注意$.show()并且$.hide()默认情况下不排队,因此,如果要$.delay()与它们一起使用,则需要以这种方式配置它们:

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

您可能会使用Queue语法,这可能会起作用:

jQuery(function($){ 

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

}); 

或者您可能真的很聪明,可以使用jQuery函数来做到这一点。

(function($){ 

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

从理论上讲,这将允许您这样做:

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

1
我想知道为什么在简单使用setTimeout时也会使用队列。
解决方案

33
因为如果您使用队列,它很容易向代码中添加新事件并重用代码,而代码重用是GoodThing™
Kent Fredric 2009年

2
请注意,正如jQuery API文档中所述,delay()实际上仅应用于与效果队列有关的事物。如果您需要超时,则仍然可以使用setTimeout()。
scy

哇,感谢@bottlenecked的链接,我想我的示例与jQuery新增功能如此相似的原因是,这个对bugs.jquery.com/ticket/4102 = P的答案产生了显着的影响链
肯特·弗雷德里克(Kent Fredric)

23

我只是在下面弄清楚了:

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

我会保留其他用户的帖子!


14

@strager的好东西。像这样将其实现到jQuery中:

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

然后将其用作:

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

11

您可以执行以下操作:

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

可悲的是,您不能只执行.animate({},2000)-我认为这是一个bug,并且会报告它。



5

为了能够像这样使用它,您需要返回this。没有返回值,fadeOut('slow')将不会获得对象来执行该操作。

即:

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

然后这样做:

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

1

只需使用几行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);
});​

请参阅下面的小提琴以获取工作示例...

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.