2014-10-08 52 views
3

在JS中創建定時器的最佳方式是什麼?簡單的定時器和設置區間

我一直在使用這個至今:

var sec = 0; 
setInterval(function(){sec +=1}, 1000); 

我注意到,當我需要毫秒,它受到了很多減慢。在瀏覽器選項卡更改上,它完全停止。

var milisec = 0; 
setInterval(function(){milisec +=1}, 1); 

我正在尋找一種更好的方式來處理這個問題,當瀏覽器窗口改變時它也會繼續工作。

+0

你想做什麼? – 2014-10-08 13:14:32

+0

https://developer.mozilla.org/en-US/docs/Web/API/window.requestAnimationFrame – Sirko 2014-10-08 13:14:57

+0

對於'setInterval',瀏覽器的最佳分辨率爲4-10ms。在不同的瀏覽器中還有[其他限制](http://www.nczonline.net/blog/2011/12/14/timer-resolution-in-browsers/)。 – 2014-10-08 13:15:31

回答

0

基於@ goleztrol的解決方案,我創建了一個替代的解決方案專門針對我的情況(它可能不適合所有人)。

我只問的確切時間時,它需要使用此功能,要知道確切的毫秒通過:

var start = new Date(); 
var msPassed = function() { 
    var now = new Date(); 
    var ms = now.getTime() - start.getTime(); 
    return ms 
} 

msPassed(); //returns time passed in ms 

我需要定位對象(在創作),這取決於有多少時間,直到他們的創作經過,所以對我來說這是一個完美的解決方案。但是,我最初的問題是要求完美的計時器,事實並非如此。無論如何,這裏是供將來參考的。

4

毫秒,定時器的分辨率不夠大。在大多數情況下,即使您將間隔設置爲1ms,回調也不會比每秒約50到250次更頻繁地調用。請參閱Timer resolution in browsers(由Sani Huttunen提及)獲取解釋。

1000毫秒會更好。但是當選項卡處於非活動狀態時,計時器仍然不會被觸發,並且在CPU忙或另一個腳本正在您的頁面上運行時可能會延遲。

一種解決方案是不增加計數器,而是測試自上次調用定時器以來實際經過了多少時間。這樣,時間保持準確,即使間隔已經延遲或暫停。

這段代碼會記住開始日期,並在每個計時器間隔內更新當前時間與開始時間之差的秒數和毫秒數。

var start = new Date(); 
var milliseconds = 0; 
var seconds = 0; 
setInterval(function() 
{ 
    var now = new Date(); 
    milliseconds = now.getTime() - start.getTime(); 
    seconds = round(milliseconds/1000); 
}, 1000); 

我已經將間隔再次設置爲1000。您可能會將其設置得更短,但會降低性能。

相關問題:How can I make setInterval also work when a tab is inactive in Chrome?

+0

你的答案與坦誠地說,有一個固定的時間間隔沒有什麼不同 - 但它激勵我找到更新事物的替代解決方案。我將分享我的解決方案作爲未來參考的答案。 – Mia 2014-10-08 13:44:20

+2

我的答案也有一個設定的時間間隔。這部分它是一樣的。不同之處在於你如何計算它(毫秒)。 – GolezTrol 2014-10-08 13:46:12

+0

一個很好的例子,爲什麼一個好的問題描述與一個問題相關。顯然,你根本不需要計時器,你只需要知道自加載頁面以來已經過了多長時間。無論如何,答案對你有幫助,這很重要。 – GolezTrol 2014-10-08 13:57:42