2012-12-10 29 views
12

Rano, szukam jakiegoś zdarzenia JavaScript, którego mogę użyć do wykrycia, kiedy okno przeglądarki mobilnej odzyska ostrość, po tym, jak użytkownik zamknie/zminimalizuje przeglądarkę (aby powrócić do ekranu głównego/innej aplikacji) lub jeśli urządzenie zostanie wznowione ze stanu uśpienia (albo użytkownik je wyłącza, albo zasypia po przekroczeniu limitu czasu ekranu).Zdarzenie JavaScript dla ponownego uruchomienia przeglądarki mobilnej lub budzenie urządzenia

Chciałbym móc znaleźć pojedyncze wydarzenie, które działa na wszystko, ale wiem, że jest to mało prawdopodobne! Zdarzenie pageshow działa na urządzeniach z systemem iOS, ale jest dość pobieżne w użyciu ze wszystkim innym. Próbowałem już focus i DOMActivate, ale żaden z nich nie wydaje się mieć pożądanego efektu.

Strona nie zawsze zawiera elementy formularzy i nie chcę, aby użytkownik musiał ponownie dotknąć strony, aby wywołać zdarzenie.

Wymóg takiego zdarzenia jest spowodowany tym, że nasz kod okresowo sprawdza nową treść, wysyłając żądania XHR. Nie są one nigdy wysyłane, gdy przeglądarka śpi, więc nigdy nie otrzymujemy nowych treści do ponownego uruchomienia limitów czasu.

Dziękuję za pomoc, jaką wy wszyscy możecie zapewnić!

Odpowiedz

12

Mieliśmy podobny problem i rozwiązać go coś takiego:

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 

W ten sposób będzie można synchronizować każdą minutę, jeśli strona jest aktywna, a jeśli umieścisz swoją przeglądarkę w trybie czuwania przez ponad minutę, co najwyżej 5 sekund minie, zanim zsynchronizujesz po ponownym otwarciu przeglądarki. Krótkie okresy mogą wyczerpać baterię bardziej, niż chcesz, więc pamiętaj o tym, dostosowując czasy do swoich potrzeb.

+0

smart. jeśli zasnął, ostatnia synchronizacja byłaby nieaktualna, a następnie odświeżyłeś lub poproszono o bycie popchniętym (jeśli używasz stron internetowych)? – oma

+1

Jeśli dobrze rozumiem twoje pytanie, odpowiedź brzmi "tak" :) robisz, co trzeba, tam gdzie nazywam moją funkcję updatePage(). W moim przypadku pytam serwer o stan i odpowiednio aktualizuję klienta. Jeśli nadal są w tym samym stanie, aktualizacja nic nie robi. – SirMarino

+0

prawda, oczywiście! Dzięki i gratulacje za nagrodę. – oma

0

Lepszym rozwiązaniem niż interwał byłoby dodanie detektora rozmycia okna i detektora okna. Przy rozmyciu, zapisz bieżący czas. Po ustawieniu ostrości sprawdź, czy nadal jesteś zalogowany/sync'd/cokolwiek musisz zrobić.

Zasadniczo to samo, ale działa tylko w razie potrzeby, zamiast spowalniać całą stronę w dół z przerwą.

Aktualizacja

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 
}); 

Choć wydaje się, że zdarzenie rozmycia szkicowy jeśli telefon jest wyłączony i zasilania nie wiem, że będę mu ufać w każdych okolicznościach/urządzeń mobilnych. Więc prawdopodobnie wrzuciłbym coś takiego:

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

dzięki czemu mój zegar bezczynności działa, gdy użytkownik po prostu odejdzie. W zależności od witryny możesz dostosować tę dokładną listę zdarzeń lub po prostu wrzucić $ window.declareActivity(); do istniejących skryptów, które odpowiadają na dane wejściowe użytkownika.

+0

Czy możesz podać przykładowy kod ilustrujący rozwiązanie? –

Powiązane problemy