2013-03-02 109 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文件中? – 2013-03-02 05:56:53

+0

這是在PHP – Mike 2013-03-02 06:04:11

回答

43

setTimeout(countdown(element), 1000);使用該參數執行您的功能並將結果傳遞到setTimeout。你不想那樣。

相反,執行調用你的函數匿名函數:

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

邁克:PS:你也可以'setTimeout(countdown,t);'如果你不需要傳遞任何東西給函數。 ;) – 2013-03-02 06:00:44

+0

是的,這工作。 – Mike 2013-03-02 06:02:01

+0

謝謝,我也忽略了這種微妙之處。 – 2015-04-09 07:13:58

4

這是因爲setTimeout是異步的。試試這個:

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

這將使函數countdown在1000毫秒後執行。

4

如果您想通過setTimeout將參數傳遞給函數,試試這個:

setTimeout(countdown, 1000, element); 

的語法setTimeout如下:

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

注意:根據[Mozilla](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout),像這樣的傳遞參數只適用於IE> = 10。 – Mike 2016-07-29 05:03:04