2011-06-06 58 views
2

我希望能夠將一個指定的時間添加到JavaScript時鐘並保持更新。我已經設法將下面的東西一起夾在一起。給javascript時鐘添加時間

function leadTimer(leadTime) 
    { 
     var d1 = new Date(), 
     d2 = new Date (d1); 
     d2.setMinutes (d1.getMinutes() + leadTime); 
     currentHours = d2.getHours(); 
     currentMins = d2.getMinutes(); 
     // Choose either "AM" or "PM" as appropriate 
     var timeOfDay = (currentHours < 12) ? "AM" : "PM"; 
     // Convert the hours component to 12-hour format if needed 
     currentHours = (currentHours > 12) ? currentHours - 12 : currentHours; 
     // Convert an hours component of "0" to "12" 
     currentHours = (currentHours == 0) ? 12 : currentHours; 
     if (currentMins<=9) { currentMins="0"+currentMins; } 
     if (currentHours<10) { currentHours="0"+currentHours; } 
     $("#result").empty(); 
     $("#result").html(currentHours + ":" + currentMins + " " + timeOfDay) 
     setInterval('leadTimer(leadTime)',10000) 
} 

我盤算了一下,setInterval只想用的當前值leadTime但我只是得到一個錯誤說leadTime是不確定的。

最終,我希望能夠調用這個來保持時鐘滴答下來,這取決於用戶選擇的內容。

+0

maerics有你的修復。當你將一個字符串傳遞給* setInterval *時,它將在全局範圍內被評估,就像'new Function()'一樣,所以* leadTime *是未定義的。通過傳遞一個函數,你可以在本地作用域中定義一個變量,所以當函數被調用時,它們是可用的。 – RobG 2011-06-06 02:01:28

回答

5

你已經差不多了; the preferred way to use setInterval是給它作爲第一個參數的功能,所以試着改變你的最後一行代替:

setInterval(function(){leadTimer(leadTime)}, 10000); 
+2

+1澄清:文章中的代碼無法正常工作的原因是,所提供的字符串中的代碼不在函數*的當前詞彙上下文中進行評估,而封閉(在此答案中使用)綁定到包含'leadTime'(封閉函數中的參數)的[[scope chain]]。 – 2011-06-06 02:00:42

+0

那種作品,我想我在其他地方有問題。在onload事件中,我調用leadTimer(20)。然後我有一個有+10的按鈕,將計時器更改爲+10,但彈回到+20分鐘時間幾秒鐘,然後再次彈回。 – maxum 2011-06-06 02:07:15

+0

@ user505055:這聽起來像你有兩個相互衝突的函數,它們反覆更新「result」元素(各種競爭條件)。一個簡單的解決方法是將leadTime作爲全局變量而不是函數參數,並讓按鈕點擊(和其他小部件)只更新其值。有一個更好的方法是全局的,但應該是最簡單的,您可能還想增加顯示功能的頻率... – maerics 2011-06-06 02:31:58