2013-03-02 96 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