50 votes

JQuery, setTimeout ne fonctionne pas

Je suis encore novice en matière de JQuery. Sur le chemin de mon exemple d'ajax, j'ai été bloqué par setTimeout. Je l'ai décomposé pour qu'il ajoute "." au div toutes les secondes.

Le code correspondant se trouve dans deux fichiers.

index.html

<html><head>
<script type='text/javascript' src='jquery.js'></script>
<script type='text/javascript' src='myCode.js'></script>
</head>
<body>
<div id='board'>Text</div>
</body>
</html>

y monCode.js

(function(){
   $(document).ready(function() {update();});

   function update() { 
      $("#board").append(".");
      setTimeout('update()', 1000);     }
 })();

le fichier myCode.js fonctionne bien et "update()" s'exécute la première fois mais jamais plus.

113voto

cletus Points 276888

Vous avez deux problèmes ici.

Tout d'abord, vous définissez votre code à l'intérieur d'un fichier de type fonction anonyme . Cette construction :

(function() {
  ...
)();

fait deux choses. Il définit une fonction anonyme et l'appelle. Il y a des raisons de faire cela, mais je ne suis pas sûr que ce soit ce que vous voulez vraiment.

Vous passez un bloc de code à setTimeout() . Le problème est que update() n'est pas dans le champ d'application lorsqu'il est exécuté de cette manière. Cependant, si vous passez dans un pointeur de fonction à la place, cela fonctionne :

(function() {
  $(document).ready(function() {update();});

  function update() { 
    $("#board").append(".");
    setTimeout(update, 1000);     }
  }
)();

car le pointeur de fonction update est dans la portée de ce bloc.

Mais comme je l'ai dit, la fonction anonyme n'est pas nécessaire et vous pouvez la réécrire comme ceci :

$(document).ready(function() {update();});

function update() { 
  $("#board").append(".");
  setTimeout(update, 1000);     }
}

o

$(document).ready(function() {update();});

function update() { 
  $("#board").append(".");
  setTimeout('update()', 1000);     }
}

et les deux fonctionnent. La seconde fonctionne parce que le update() dans le bloc de code est dans le champ d'application maintenant.

Je préfère également le $(function() { ... } forme de bloc abrégée et plutôt que d'appeler setTimeout() sur update() vous pouvez simplement utiliser setInterval() à la place :

$(function() {
  setInterval(update, 1000);
});

function update() {
  $("#board").append(".");
}

J'espère que ça va éclaircir les choses.

20voto

meder Points 81864
setInterval(function() {
    $('#board').append('.');
}, 1000);

Vous pouvez utiliser clearInterval si vous souhaitez l'arrêter à un moment donné.

8voto

Goysar Points 414

SetTimeout est utilisé pour faire en sorte que votre ensemble de code s'exécute après une période de temps spécifiée. Pour vos besoins, il est préférable d'utiliser setInterval car cela appellera votre fonction à chaque fois à un intervalle de temps spécifié.

0voto

Victor Stoddard Points 158

Cette méthode permet d'obtenir le même résultat, mais elle est beaucoup plus simple :

$(document).ready(function() {  
   $("#board").delay(1000).append(".");
});

Vous pouvez enchaîner un délai avant presque toutes les méthodes jQuery.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X