2013-03-02 10 views
24

私はJavascriptで秒のカウントダウンをしようとしています。ここでsetTimeout()が待機していません

は私のHTMLは

<div id="ban_container" class="error center">Please wait 
     <span id="ban_countdown" style="font-weight:bold"> 
     45</span> 
     seconds before trying again 
</div> 

そして、私のJSです:

<script type="text/javascript"> 
    var seconds = <?php echo $user->getBlockExpiryRemaining(); ?>; 

    function countdown(element) { 
     var el = document.getElementById(element); 

     if (seconds === 0) { 
      document.getElementById("ban_container").innerHTML = "done"; 
      return; 
     } 
     else { 
      el.innerHTML = seconds; 
      seconds--; 
      setTimeout(countdown(element), 1000); 
     } 
    } 

    countdown('ban_countdown'); 
</script> 

は、しかし、いくつかの理由で、それはタイムアウト時間を待っていないが、私はリフレッシュしたときにように代わりにすぐcountdownを実行しますすぐに「完了」と表示されるページ。 innerHTML += seconds + " ";を実行すると、45からカウントダウンされるため、実際に複数回実行されていることがわかります。なぜタイムアウトをバイパスしていますか?

+0

スクリプトは独自のファイルまたは.phpファイルですか? –

+0

PHPにあります – Mike

答えて

43

setTimeout(countdown(element), 1000);は、その引数で関数を実行し、その結果をsetTimeoutに渡します。あなたはそれを望んでいません。の

setTimeout(countdown, 1000, element); 

構文:あなたはsetTimeoutで関数に引数を渡すしたい場合

setTimeout(function() { 
    countdown(el); // You used `el`, not `element`? 
}, 1000); 
+2

Mike:PS:関数に何も渡す必要がない場合は、 'setTimeout(countdown、t);を実行することもできます。 ;) –

+0

はい、これはうまくいきました。 – Mike

+0

ありがとう、私もこの微妙を見落としました。 –

4

これは、setTimeoutが非同期であるためです。試してください:

setTimeout(function(){ 
    countdown('ban_countdown'); //or elemement 
}, 1000); 

これは1000ミリ秒後に機能のカウントダウンを実行します。

4

、これを試してみてください。

代わりに、あなたの関数を呼び出す匿名関数を実行しますsetTimeoutは次のとおりです。

setTimeout(function,milliseconds,param1,param2,...) 
+0

注:[Mozilla](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout)によると、このようなパラメータを渡すことは、IE> = 10でのみ機能します。 – Mike

関連する問題