2009-07-29 133 views
4

有誰知道如何編寫一個JavaScript函數,如果瀏覽器的JavaScript引擎閒置了一段時間,它將返回true。如何檢測Javascript空閒?

我很高興使用mootools/jQuery等,如果更容易,輕微偏好mootools。

編輯:

我實際的問題:我正在做一個第三方的API的調用。該調用立即返回,但它對DOM的實際工作持續了一段時間(在很多情況下> 10秒)。我希望我的一些代碼在DOM工作完成後立即運行。我對所調用的API函數的內部信息一無所知,所以我一直在尋找一種確定函數是否完成的通用方法。

回答

3

如果你調用這樣的函數,是否不會重置任何空閒時間計數器,假設存在?

如果你能勾勒出你正在試圖解決這可能是因爲我們可以給你一隻手的問題。我可以想辦法解決「自此功能運行多久以來」或「頁面上一次事件發生後多久」或「如果用戶在此頁面上爲X秒「,但我沒有任何好的方法來做」只有在X秒沒有任何事情發生時才這樣做「。

更新

根據您的更新,我會尋找在API中回調機制(你能分享它是什麼?),這將讓你安排一些工作,爲API完成後, 。如果不工作,你可以嘗試添加類似:

setTimeout(function() { myCallbackMethod(); }, 0); 

這將安排您的回調一旦當前執行完成啓動。這取決於javascript引擎是單線程的,但我已經看到它用得很好。

+0

我已經添加到我的問題。 – jjujuma 2009-07-29 14:01:07

0

有兩個事實可以利用來衡量javascript/flash線程的閒置。

  1. 只蜱當JavaScript是空閒的Javascript已定時源(setTimeout, setInterval)。因此線程越少,定時器越慢。

    「JavaScript可以永遠只執行一個 一段代碼在一個時間(由於其 單線程性質),每個這些代碼 塊被‘阻塞’其它異步事件的 進展。 這意味着當發生異步事件(如鼠標單擊,完成定時器觸發或XMLHttpRequest 完成)時,它將排隊等候到 稍後執行。「 How JavaScript Timers Work

  2. 的Javascript具有蜱不管空閒外部定時源。類實例Date()基於外部時鐘,可以使用getTime()獲取毫秒定時:

    var timeSinceDisco =(new Date).getTime();

eJohn有一些有趣的測試using getTime() for benchmarking

我們使用外部計時器Date.getTime()和內部時間setTimeout之間的差異來計算JavaScript線程的空閒程度。當然,這對於性能新的JavaScript引擎(如V8tracemonkey)來說並不適用,因爲它們使用多個線程。它應該適用於當前大多數瀏覽器。

Lessons from Gmail: Using Timers Effectively

+1

你確定這是不是實現依賴? – Cide 2009-07-29 13:52:36

+1

我同意慈德,但在其他方面一個聰明的做法 – jlarson 2009-07-29 13:54:36

+0

@Cide以我的經驗setTimeout的工作方式相同跨所有,但多線程的JS引擎。我同意,雖然這可能是瀏覽器之間的一些非常棘手的不同行爲。 – 2009-07-29 14:19:00

0

我99.4%肯定沒有這樣的功能,但是,我希望有,因爲我真的需要它。

當然,您可以在這裏構建您自己的解決方案(您在每個入口點函數的開始處調用的函數),具體取決於細節可能是低開銷。

var Tracker={ 
last: new Date().geTime(), 
activity:function() { this.last=new Date().geTime(); }, 
idle:function() { return new Date().geTime()-this.last; } 
} 


... 

var clickedSomething=function() { 
Tracker.activity(); 
...real code.. 
} 
0

你可以調用一個函數來檢查鼠標X和Y位置每個定時器的時間間隔,並加以比較,以最後一次保存的X和Y位置,如果他們是一樣的,所以它的閒置。

MooTools Sample