2017-02-17 108 views
0

我已經做了一個計時器從this問題得分最高的答案。 問題是,當它到達0時,它會將日期更改爲第二天,並啓動新的24小時定時器。防止溢出JS計時器

T1; dr 00:00:00 - > 23:59:59而不是永遠保持00:00:00。

我當前的代碼:

function getTimeLeft() { 
    var seconds_left = end_time - Math.floor(Date.now()/1000); 
    var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8); 
    $('#test-time-left').text(time_left); 
} 
setInterval(getTimeLeft, 1000); 

爲了讓00:00:00,我想到了解決它的2種方式。

一(恕我直言更好)將在while循環給setInterval(getTimeLeft, 1000);與條件seconds_left >= 0。但我沒有什麼問題。

  1. 我不知道如何傳遞函數外的變量。

  2. 我不知道是否阻止setInterval會做任何事情,但我可能只是將間隔設置爲0(ergo將其關閉)。

第二種辦法簡單地做while的函數內部:

while(seconds_left >= 0){ 
     var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8); 
} 

問題:

  1. 浪費資源,因爲JS腳本仍然是正在做

@編輯最終結果:

function getTimeLeft() { 
    var seconds_left = end_time - Math.floor(Date.now()/1000); 
    if (seconds_left <= 0) 
    { 
    seconds_left = 0; 
    clearInterval(timer); 
    } 
    var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8); 
    $('#test-time-left').text(time_left); 
} 
var timer = setInterval(getTimeLeft, 1000); 

我還將seconds_left設置爲0,以防腳本錯過0秒幀(例如用戶在倒計時發生時關閉瀏覽器)。

回答

1

假設你要停止計時器時seconds_left等於0,你可以簡單地清除間隔:

function getTimeLeft() { 
    var seconds_left = end_time - Math.floor(Date.now()/1000); 
    var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8); 
    if(seconds_left === 0) { 
    clearInterval(timer); // clear the interval 
    } 
    $('#test-time-left').text(time_left); 
} 

var timer = setInterval(getTimeLeft, 1000); //save the timer in a variable 

請注意,您的使用while循環工作理念:

while(seconds_left >= 0){ 
    var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8); 
} 

JavaScript是單線程的,這意味着間隔代碼將而不是運行,而您的while循環正在運行,因此創建一個無限循環(可能會導致瀏覽器崩潰)。

+0

是否等值和平等類型是必需的?我想用<=來代替那個。以防萬一用戶關閉瀏覽器和JavaScript不運行,它會錯過第二幀。請參閱主文章中的編輯 – Kappa

+0

如果用戶關閉瀏覽器,時間間隔將自動取消。應該可以使用'<='而不是'==='。 –

+0

時間間隔,但日期更改,但無論如何,一切工作正常。謝謝。 – Kappa

0

我同意一切Rick Hithcock說。這裏是一個基於你的代碼的例子,它從現在起10秒鐘設置計時器,然後倒計時。

var end_time = new Date(); 
end_time.setSeconds(end_time.getSeconds() + 10); 

function getTimeLeft() { 
    var now = new Date(); 
    var seconds_left = (end_time - now)/1000; 
    if (seconds_left <= 1) { 
     clearInterval(timerID); 
    } 
    var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8); 
    $('#test-time-left').text(time_left); 
} 
timerID = setInterval(getTimeLeft, 1000);