2013-11-23 20 views
0

我有一個函數timer(),我希望在頁面加載時立即運行一次,然後每秒運行一次。如何在頁面加載時啓動腳本,然後使用setInterval

目前我使用的setInterval下面的代碼:

$(document).ready(function() { 
var timer = function(){ 
    ... 
} 

timer(); 

setInterval(function(){ 
     timer(); 
}, 1000); 
}); 

注意,我不只是要單獨使用setInterval的,因爲這會產生頁面加載後1秒的延遲

但是,我使用timer();似乎停止了頁面上的其他腳本的工作。有任何想法嗎?控制檯中沒有錯誤。

回答

2

我會使用setTimeout()代替:

$(document).ready(function() { 
    var timerLoop; 
    var timer = function(){ 
       ... 
      timerLoop = setTimeout(timer, 1000); 
     }; 
    timer(); 
} 

通知的timerLoop變量,如果需要的話,您可以使用停止 「間隔」(clearTimeout(timerLoop);)。

Timeouts並不是真的異步,它們只是計時。如果還有另一個腳本正在運行,則在上一個腳本完成後執行定時腳本。

我寧願setTimeout()代替seInterval(),因爲後者有一個缺點:如果有另一個腳本攔截由setInterval()設置定時調用的執行,這些調用堆疊,並在阻止腳本完成後,所有堆疊電話儘可能快地執行。通常這是不希望的行爲。

+0

謝謝,這還可以防止其他腳本加載雖然.ready函數? – alias51

+0

執行定時腳本也會阻止其他腳本。如果你在腳本中加載腳本,那麼加載本身是異步完成的,但在當前腳本完成之前不會執行任何操作。 – Teemu

+0

@ alias51爲了向您展示'setInterval()'與'setTimeout()'的區別,請檢查[「a-mess-fiddle」](http://jsfiddle.net/BKupY/3/)非IE瀏覽器),訪問另一個標籤一段時間,然後返回到「a-mess-fiddle」。然後在[「working-fiddle」](http://jsfiddle.net/BKupY/5/)上做同樣的事情,你會看到不同之處。 – Teemu

0

嘗試console.log(timer)你會清楚地看到它是一個數字,而不是你可以調用的函數。

相反,您必須手動調用該函數以及設置計時器。

function timer() { 
    // do something 
} 
$(function() { 
    timer(); 
    setInterval(timer,1000); 
}); 

或者,您也可以使用重複超時:

function timer() { 
    // do something 
    setTimeout(timer,1000); 
} 
$(timer);