1

下面的代码会定期使用新文本更新 div 元素。如果我在 Chrome 调试器中设置断点并以步进模式运行,代码会按预期更新 html。但是,如果在没有设置任何断点的情况下运行,我会看到:

分钟 = 0 秒 = 0

打印然后没有变化。

我究竟做错了什么?

<html>
<script type="text/javascript">
var g_t1 = null;
var g_t2 = null;

function StartTimer() {
   g_t1 = new Date();
}

function StopTimer() {
   g_t2 = new Date();
}

function CalcDuration() {
   StopTimer();

   var diff = g_t2.getTime() - g_t1.getTime();
   var place = document.getElementById("here");
   var minutes = Math.floor((diff / 1000) / 60);
   var seconds = Math.floor((diff / 1000) % 60);
   place.innerHTML = "minutes = " + minutes + " seconds = " + seconds;

   window.setTimeout(CalcDuration(), 100);
}

function Poller() {
   if(!g_t1)
     StartTimer();

   window.setTimeout(CalcDuration(), 100);
}

</script>
<body onload="Poller();">
<div id="here"></div>
</body>
</html>

编辑。

对于任何对这两种变体都感兴趣的人:

window.setTimeout(CalcDuration, 100);

或者

window.setTimeout(function(){CalcDuration()}, 100);
4

2 回答 2

1

您需要将计时器函数调用包装在匿名函数中,否则它会立即执行,而不是在计时器范围内。

window.setTimeout(function(){CalcDuration()}, 100);
于 2013-01-18T15:14:20.123 回答
0

当 setTimeout 在调试模式下工作,但不是在生产中,并且您使用函数引用语法时,例如

window.setTimeout(CalcDuration, 100);

那么你应该确保你正在定义这样的函数:

CalcDuraction = function() {
   ...
}

而不是

function CalcDuration() {
   ...
}
于 2017-05-03T11:59:59.540 回答