2013-01-07 142 views
3

有什麼方法可以檢測到瀏覽器掛起/凍結/掛起(例如:通過OS鎖定屏幕)?瀏覽器掛起/掛起檢測

我有一個問題與ajax計時器機制。點擊按鈕向控制器發送ajax請求以啓動時鐘。與此同時瀏覽器打開,另一個腳本(通過「setInterval」)使時鐘運行。當再次點擊該按鈕時,ajax請求停止定時器並且setInterval被終止。

但是,我需要檢測,該瀏覽器被凍結(JavaScript停止),如果是,請發出ajax請求更新計時器。

我在想,如果它實際上可以通過JavaScript和現代瀏覽器。是嗎?

編輯: 我想我第一次沒有解釋清楚。 無限循環是必須的。這些元素是計時器(秒錶)。而且我不想檢測腳本是否因js錯誤或瀏覽器過載而凍結。

我想檢測瀏覽器(js)是否因操作系統鎖屏,操作系統睡眠或其他原因而停止。

+0

瀏覽器頁面懸掛的問題在於它通常是一個JavaScript無限循環或類似導致掛起的問題。當發生這種情況時你不能運行JS,因爲它會等待掛起的JS完成。 – Cerbrus

+3

我認爲如果你不讓瀏覽器凍結無限循環會更好。 –

+0

如果瀏覽器被凍結,你將如何發出ajax請求? – JJJ

回答

0

Ajax請求使用JavaScript代碼完成。如果有任何javascript導致瀏覽器掛起/凍結,則意味着可能存在一個不允許在特定JavaScript代碼前移動的錯誤。一旦它凍結瀏覽器,BROWSER會嘗試檢測該錯誤(而不是腳本,因爲腳本本身已被凍結)。它的軟件(瀏覽器軟件是IE/FF/Chrome)。

最好將包裝在

try 
{ 
} 
catch 
{ 
} 

你的JavaScript代碼來捕獲錯誤。

0

不可能。遠程接近的唯一東西就是聽窗口關閉,並在你的代碼中執行一些最後一段代碼,以消除呼吸。

window.onbeforeunload = function(event) { 
    //do something, ask if the user really wants to exit the page, cancel ajax or whatever it is you need to achieve. 
} 
1

不保證跨瀏覽器兼容性或任何類型的標準符合性;這是一個有點駭人聽聞,真的取決於情況。

(function() { 
    // milliseconds 
    var lastTime = (new Date).getTime() 
    , acceptableDelta = 500 
    , tick = 1000 
    , hung = false; 

    function hangman() { 
     var now = (new Date).getTime(); 
     if(now - lastTime > (tick + acceptableDelta)) { 
      hung = true; 
     } else if(hung) { 
      hung = false; 
      console.warn('Possible browser hangup detected.'); 
     } 
     lastTime = now; 
    } 

    setInterval(hangman, tick); 
}()); 

這背後的概念是,如果瀏覽器能夠阻止用戶失控的腳本,但離開頁面的其餘部分以某種方式不變的,計時器會檢測到這種差異,並警告在控制檯的用戶。

jsFiddle here,公正的警告,請示範請不要點擊按鈕,除非你真的想要無限循環開始。


最後,你可能要重新考慮你爲什麼要擺在首位這樣做的,在任何戰鬥的來源,在設計層面潛在的瀏覽器掛斷。避免沉重而連續的工作負載,無需停頓,無限循環,處理器密集型操作等。使用異步回調將任務空間化,並在代碼中放置戰略性延遲,以使瀏覽器和用戶的計算機有一定的呼吸空間。