0

想知道这段代码哪里出错了,基本上 startTime() 只运行一次,就是这样,所以时钟不会更新。谁能告诉我如何解决这个问题?

JS

function startTime(){
  var today=new Date();
  var h=today.getHours();
  var m=today.getMinutes();
  var s=today.getSeconds();
  // add a zero in front of numbers<10
  m=checkTime(m);
  s=checkTime(s);
  document.getElementById('txt').innerHTML=h+":"+m+":"+s;
  t=setTimeout('startTime()',500);
  }

  function checkTime(i){
  if (i<10)
    {
    i="0" + i;
    }
  return i;
  }

HTML

    <body onload="startTime()">

<p>Date</p>
<?php echo date("d/m/y"); ?>

<p>Time</p>
<div id="txt"></div>

链接http://bit.ly/IC9ohX

4

2 回答 2

5

您只是对函数的范围界定有疑问。

简短的解决方案:改变

t=setTimeout( 'startTime()',500);

对此。

t = setTimeout( startTime, 500 );

解释:

该函数startTime是在函数中定义的,window.onload并且仅在该函数(以及其中的函数)中可见!

在您的代码中,JavaScript 等待 500 毫秒,然后尝试执行代码startTime()startTime它在全局范围(即 的执行范围)中搜索函数,但setTimeout找不到任何引用,从而导致错误并且您的代码无法正常工作。

我的代码将函数的引用传递startTimesetTimeout. 这样引擎就不必搜索处理程序,也不会在那时失败。在setTimeout被调用的地方,您处于 的范围内window.unload,因此引擎知道该函数startTime并可以处理传递给 的处理程序setTimeout

于 2012-05-07T15:22:12.077 回答
0

setTimeout等待指定的时间,完成它的工作,然后停止。你想要setInterval,它无限期地重复相同的工作。

编辑:对不起,我在阅读您的代码时脑残了。没有意识到您在函数结束时调用了 setTimeout。

尽管如此,仍然有一个有效的用例来使用 setInterval 而不是 setTimeout。假设您的函数本身需要 2 毫秒才能完成。您的时钟实际上不是每半秒更新一次,而是每 502 毫秒更新一次。因此,在 100 次迭代后,它将在距离应有的位置 0.2 秒后执行。这可能并不明显,但是 1 秒的 setInterval 会使您的时钟实际上看起来每秒都在滴答作响,正如它应该的那样。

于 2012-05-07T15:21:53.227 回答