2016-04-14 28 views
0

我試圖理解這段代碼的自動刷新頁面:理解在JavaScript

function setIdle(cb, seconds) { 
    var timer; 
    var interval = seconds * 1000; 
    function refresh() { 
      clearInterval(timer); 
      timer = setTimeout(cb, interval); 
    }; 
    $(document).on('keypress, click', refresh); 
    refresh(); 
} 

setIdle(function() { 
    location.href = location.href; 
}, 5); 

setIdle有兩個參數。在其功能內部,它具有功能refresh,其清除Timeout功能上的定時器。現在,每當一個事件發生時(clickkeypressrefresh()被調用。

,然後最終這個函數被調用傳遞另一個功能和和int值(5),其後面將是秒的量的計時器。在後面通過cb表示的其他功能中,頁面將被刷新(location.href = location.href;)。

這將導致automaticpage刷新每5秒。

所以現在我不明白,如果我把一個附加功能:

setIdle(function() { 
     console.log('hi'); 
    }, 1); 

爲什麼第二個函數只調用一次,而不是每秒鐘像其他一個?

+1

你可能會發現一個有趣的類似問題:[優雅地檢測JavaScript中的空閒時間](http://stackoverflow.com/questions/667555/detecting-idle-time-in-javascript-elegantly)。 – Roberto

回答

1

setIdle不運行的回調函數,每5秒。它會在您撥打setIdle 5秒鐘後運行一次,如果您鍵入或單擊某個事件,超時將被再次推回。所以它運行一次,當你閒置5秒鐘。

頁面刷新每5秒的原因是因爲回調函數重新加載頁面,並重新加載頁面再次運行頁面中的所有Javascript,因此再次調用setIdle()

但是你的第二個使用setIdle不重新載入頁面,所以它只是記錄hi一次。

如果您想每N秒重複一次,請使用setInterval而不是setTimeout

BTW,clearInterval應該是clearTimeout。在大多數瀏覽器中,它們當前可以互換,但不能保證。見Are clearTimeout and clearInterval the same?

+0

我明白了,謝謝! – Tom