2012-12-10 33 views
12

早上好,我正在尋找某種Javascript事件,當用戶關閉/最小化他們的瀏覽器後,我可以使用它來檢測移動瀏覽器窗口是否重新獲得焦點。返回到主屏幕/不同的應用程序),或者設備從睡眠狀態恢復(用戶關機或在屏幕超時後進入休眠狀態)。Javascript event for mobile browser re-launch or device wake

我希望能夠找到適用於所有事情的單一事件,但我知道這不太可能! pageshow事件適用於iOS設備,但與其他所有設備配合使用則相當粗略。我試過focusDOMActivate,但他們都沒有達到預期的效果。

頁面上可能並不總是有表單元素,我不想讓用戶再次觸摸頁面來觸發事件。

這種事件的需求是由我們的代碼通過製作XHR請求定期檢查新內容而引起的。當瀏覽器處於睡眠狀態時,這些信息永遠不會被髮送,所以我們永遠不會獲得新的內容來重新啓動超時。

感謝您提供任何幫助!

回答

12

我們也有類似的問題,解決了這個問題是這樣的:

var lastSync = 0; 
var syncInterval = 60000; //sync every minute 

function syncPage() { 
    lastSync = new Date().getTime(); //set last sync to be now 
    updatePage(); //do your stuff 
} 

setInterval(function() { 
    var now = new Date().getTime(); 
    if ((now - lastSync) > syncInterval) { 
    syncPage(); 
    } 
}, 5000); //check every 5 seconds whether a minute has passed since last sync 

這樣,您將同步每一分鐘,如果你的網頁是活動的,如果你把你的瀏覽器在空閒模式下超過一分鐘,在再次打開瀏覽器時同步前最多5秒鐘。較短的時間間隔可能會使電池電量超出您的需要,因此請在適應您的需要時記住這一點。

+0

聰明。如果它已經睡着了,lastSync會過時,然後刷新或要求推送(如果使用websockets)? – oma

+1

如果我正確地理解你的問題,答案是'是':) 你可以做任何你需要的地方來調用我的updatePage()函數。就我而言,我向服務器請求一個狀態並相應地更新客戶端。如果它們仍處於相同狀態,則更新不會執行任何操作。 – SirMarino

+0

對,當然!謝謝並祝賀賞金。 – oma

0

比間隔更好的是添加窗口模糊偵聽器和窗口焦點偵聽器。在模糊時,記錄當前時間。在焦點上,驗證您仍然登錄/同步/無論您需要做什麼。

基本上完全一樣的東西,但它只在必要時運行,而不是放慢整個頁面的間隔。

更新

var $window = $(window), 
    $window.__INACTIVITY_THRESHOLD = 60000; 

$window.add(document.body); //necessary for mobile browsers 

$window.declareActivity = function() { $window.__lastEvent = new Date(); }; 

$window.blur($window.declareActivity); 
$window.focus(function(){ 
    var diff = (new Date()) - $window.__lastEvent; 
    if (diff > $window.__INACTIVITY_THRESHOLD) { 
    $window.trigger("inactivity"); 
    } 
}); 

$window.on("inactivity", "", null, function() { 
    //your inactivity code 
}); 

雖然是模糊事件,如果手機處於關機狀態,我不知道我會在所有情況下/移動設備信任似乎粗略。所以我可能會扔這樣的東西:

$(document.body).on("click scroll keyup", "", null, $window.declareActivity); 

這樣,我的不活動計時器適用於當用戶剛剛走開以及。根據您的網站,您可能需要調整確切的事件列表 - 或者直接輸入$ window.declareActivity();插入到對用戶輸入做出響應的現有腳本中。

+0

您能否提供一些示例代碼來說明您的解決方案? –