2012-05-07 57 views
0

想知道我在哪裏出錯了,這段代碼基本上startTime()只能運行一次,因此時鐘不會更新。任何人都可以告訴我如何解決這個問題?javascript時鐘麻煩運行定時器功能?

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

回答

5

你只是有一個功能範圍的問題。

簡短的解決方案:更改

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

了這一點。

t = setTimeout(startTime, 500); 

說明:

(內它和功能)

功能startTime是在函數中定義爲window.onload,並且是函數中才可見!

在您的代碼中,JavaScript等待500ms,然後嘗試執行代碼startTime()。它在全局範圍(這是setTimeout的執行範圍)中搜索函數startTime,並且找不到任何引用,從而導致錯誤並且代碼無法工作。

我的代碼將函數startTime的引用傳遞給setTimeout。通過這種方式,引擎不必搜索處理程序,也不會在此時失敗。在調用setTimeout時,您處於window.unload的範圍內,因此引擎知道函數startTime,並且可以處理傳遞給setTimeout的處理函數。

0

setTimeout等待指定的時間,它的工作,然後停止。 你想setInterval,無限期地重複同樣的工作。

編輯:對不起,我在閱讀您的代碼時腦殘。沒有意識到你在函數結束時調用了setTimeout。

儘管使用setInterval而不是setTimeout仍然有一個有效的用例。假設你的函數本身需要2毫秒才能完成。您的時鐘實際上每502毫秒更新一次,而不是每半秒更新一次。所以,經過100次迭代後,它將從應該在的位置執行0.2秒。它可能不明顯,但1秒的setInterval會使您的時鐘實際上每秒鐘都會出現,因爲它應該如此。