Efekty Timeout jQuery

101

Próbuję, aby element zanikał, a następnie za 5000 ms zanikał ponownie. Wiem, że mogę zrobić coś takiego:

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

Ale to będzie kontrolować tylko zanikanie, czy dodałbym powyższe do wywołania zwrotnego?

Coughlin
źródło

Odpowiedzi:

197

Aktualizacja: Od wersji jQuery 1.4 możesz używać .delay( n )metody. http://api.jquery.com/delay/

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

Uwaga : $.show()i $.hide()domyślnie nie są w kolejce, więc jeśli chcesz $.delay()z nimi korzystać, musisz je skonfigurować w ten sposób:

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

Możesz użyć składni kolejki, to może zadziałać:

jQuery(function($){ 

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

}); 

lub możesz być naprawdę pomysłowy i stworzyć funkcję jQuery, która to zrobi.

(function($){ 

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

co pozwoliłoby (w teorii pracować tutaj na pamięci):

$('.notice').fadeIn().idle(2000).fadeOut('slow'); 
Kent Fredric
źródło
1
Zastanawiam się, dlaczego korzystasz z kolejki, skoro proste użycie setTimeout też się sprawdzi.
Rozwiązanie
33
ponieważ jeśli korzystasz z kolejki, łatwo jest dodawać nowe zdarzenia do kodu i ponownie go używać, a ponowne użycie kodu to GoodThing ™
Kent Fredric,
2
Zauważ, że, jak również stwierdzono w dokumentacji jQuery API, delay () powinno być używane tylko do rzeczy związanych z kolejką efektów. Jeśli potrzebujesz limitu czasu na coś innego, setTimeout () jest nadal właściwą drogą.
scy
Wow, dzięki za link @bottlenecked, domyślam się, że powodem, dla którego mój przykład jest tak podobny do nowej funkcji dodanej do jQuery, jest znaczący wpływ tej odpowiedzi na bugs.jquery.com/ticket/4102 = P
Kent Fredric
23

Właśnie to rozgryzłem poniżej:

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

Zachowam ten wpis dla innych użytkowników!

Coughlin
źródło
14

Świetny hack autorstwa @strager. Zaimplementuj to do jQuery w następujący sposób:

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

A następnie użyj go jako:

$('.notice').fadeIn().wait(2000).fadeOut('slow');
Arash Milani
źródło
11

Możesz zrobić coś takiego:

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

Niestety, nie możesz po prostu zrobić .animate ({}, 2000) - myślę, że to jest błąd i zgłosimy go.

strager
źródło
5

Aby móc z niego korzystać w ten sposób, musisz wrócić this. Bez powrotu fadeOut ('slow') nie otrzyma obiektu do wykonania tej operacji.

To znaczy:

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

Następnie zrób to:

$('.notice').fadeIn().idle(2000).fadeOut('slow');
user128026
źródło
1

Można to zrobić za pomocą zaledwie kilku wierszy 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);
});​

zobacz poniższe skrzypce, aby zobaczyć działający przykład ...

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

DaveAlger
źródło