Comment attendre 5 secondes avec jQuery?


404

J'essaie de créer un effet où la page se charge et après 5 secondes, le message de réussite à l'écran s'estompe ou glisse vers le haut.

Comment puis-je atteindre cet objectif?

Réponses:


733

Construit en javascript setTimeout .

setTimeout(
  function() 
  {
    //do something special
  }, 5000);

MISE À JOUR : vous voulez attendre depuis la fin du chargement de la page, alors mettez ce code dans votre $(document).ready(...);script.

MISE À JOUR 2 : jquery 1.4.0 a introduit la .delayméthode. Vérifiez-le . Notez que .delay ne fonctionne qu'avec les files d'attente d'effets jQuery.


2
y a-t-il quelque chose dans jQuery que vous pouvez utiliser au lieu d'utiliser setTimeout?
Andrew

37
jQuery est écrit en javascript. Si vous incluez et utilisez jQuery, vous avez besoin de javascript. Si vous avez javascript, vous l'avez setTimeout.
Alex Bagnolini

4
Ouais je sais. Je veux dire que $ ('. Message'). Wait (5000) .slideUp (); serait tellement plus agréable. mais je ne pense pas qu'une fonction wait () existe.
Andrew

18
.delay (5000) rocks
demoncodemonkey

66
Juste un petit mot - .delay ne fonctionne qu'avec les files d'attente d'effets jQuery, il est donc parfait pour les diapositives et les fondus comme celui-ci. Il m'a juste fallu un certain temps pour réaliser que cela ne fonctionne pas pour d'autres choses que vous pouvez faire avec jQuery.
Joel Beckham

61

Utilisez un minuteur javascript normal:

$(function(){
   function show_popup(){
      $("#message").slideUp();
   };
   window.setTimeout( show_popup, 5000 ); // 5 seconds
});

Cela attendra 5 secondes après que le DOM soit prêt. Si vous voulez attendre que la page soit réellementloaded vous devez utiliser ceci:

$(window).load(function(){
   function show_popup(){
      $("#message").slideUp();
   };
   window.setTimeout( show_popup, 5000 ); // 5 seconds
})

EDIT: En réponse au commentaire du PO demandant s'il existe un moyen de le faire dans jQuery et de ne pas utilisersetTimeout la réponse, c'est non. Mais si vous vouliez le rendre plus "jQueryish", vous pourriez l'envelopper comme ceci:

$.wait = function( callback, seconds){
   return window.setTimeout( callback, seconds * 1000 );
}

Vous pourriez alors l'appeler comme ceci:

$.wait( function(){ $("#message").slideUp() }, 5);

44

J'ai rencontré cette question et j'ai pensé fournir une mise à jour sur ce sujet. jQuery (v1.5 +) inclut un Deferredmodèle qui (bien qu'il n'adhère pas à la spécification Promises / A avant jQuery 3) est généralement considéré comme un moyen plus clair d'aborder de nombreux problèmes asynchrones. La mise en œuvre d'une $.wait()méthode utilisant cette approche est particulièrement lisible je crois:

$.wait = function(ms) {
    var defer = $.Deferred();
    setTimeout(function() { defer.resolve(); }, ms);
    return defer;
};

Et voici comment vous pouvez l'utiliser:

$.wait(5000).then(disco);

Cependant , si, après une pause, vous souhaitez uniquement effectuer des actions sur une sélection de jQuery unique, alors vous devriez être en utilisant natif de jQuery .delay()que je crois utilise aussi de différé sous le capot:

$(".my-element").delay(5000).fadeIn();

1
Ian Clark - c'est une solution super incroyable! Je l'aime beaucoup et je l'utiliserai dans mes projets. Je vous remercie!
Anton Danilchenko

Je ne sais pas pourquoi ce court morceau de code ne fonctionne pas
MR_AMDEV

26
setTimeout(function(){


},5000); 

Placez votre code à l'intérieur du { }

300 = 0.3 seconds

700 = 0.7 seconds

1000 = 1 second

2000= 2 seconds

2200 = 2.2 seconds

3500 = 3.5 seconds

10000 = 10 seconds

etc.


7
En quoi est-ce différent de la réponse acceptée ?
Tunaki

2
formatage / syntaxe et il donne une plus grande clarification sur le calendrier.
maudulus

17

J'ai utilisé celui-ci pour une superposition de messages qui peut être fermée immédiatement en cliquant ou il se ferme automatiquement après 10 secondes.

button = $('.status-button a', whatever);
if(button.hasClass('close')) {
  button.delay(10000).queue(function() {
    $(this).click().dequeue();
  });
}

1
+10, cela devrait être la bonne réponse, .delay()et elle peut être imbriquée
wpcoder


6

Sur la base de la réponse de Joey, j'ai trouvé une solution prévue (par jQuery, lire sur la «file d'attente»).

Il suit quelque peu la syntaxe jQuery.animate () - permet d'être enchaîné avec d'autres fonctions fx, prend en charge 'slow' et d'autres jQuery.fx.speeds tout en étant entièrement jQuery. Et sera géré de la même manière que les animations, si vous les arrêtez.

Le terrain de test jsFiddle avec plus d'utilisations (comme montrer .stop ()), peut être trouvé ici .

le cœur de la solution est:

$('<queue/>')
.delay(100 /*ms*/)
.queue( (next) => { $('#result').text('done.'); next(); } );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

le tout comme un plugin, prenant en charge l'utilisation de $ .wait () et $ (..). wait ():

// add wait as $.wait() standalone and $(elem).wait() for animation chaining
(function($) {

  $.wait = function(duration, completeCallback, target) {
    $target = $(target || '<queue />');
    return $target.delay(duration).queue(function(next){completeCallback && completeCallback.call($target); next();});
  }

  $.fn.wait = function(duration, completeCallback) {
    return $.wait.call(this, duration, completeCallback, this);
  };

})(jQuery);

//TEST
$(function() {

  // stand alone
  $.wait(1000, function() {
    $('#result')
    .append('...done');
  });

  // chained
  $('#result')
  .append('go...')
  .wait('slow', function() {
    $(this).append('after slow');
  })
  .css({color: 'green'});
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

Remarque: comme l'attente ajoute à la pile d'animation, $ .css () est exécuté immédiatement - comme il est supposé: comportement jQuery attendu.


1
$( "#foo" ).slideUp( 300 ).delay( 5000 ).fadeIn( 400 );

1

Sachez que c'est une vieille question, mais j'ai écrit un plugin pour résoudre ce problème que quelqu'un pourrait trouver utile.

https://github.com/madbook/jquery.wait

vous permet de faire ceci:

$('#myElement').addClass('load').wait(2000).addClass('done');
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.