2012-01-04 3 views
13

Aplikacja, którą tworzę, jest zbudowana wokół jQuery Mobile i jakiegoś Ajaxa w celu odświeżenia części strony. Podobnie jak witryny korzystające z automatycznego odświeżania, chcę zatrzymać odświeżanie po pewnych warunkach (time/visibility/etc.), Więc mój serwer nie jest bombardowany niepotrzebnymi żądaniami. Aplikacja ma ekran stanu, który jest często sprawdzany przez użytkownika, a najlepiej, aby moje skrypty wiedziały, że okno przeglądarki stało się ostrzejsze i nadszedł czas na odświeżenie. Robiłem to już wcześniej w stacjonarnych webapps, ale ja widząc wiele wariacji na mobilnej stronie pomiędzy różnymi platformami i przeglądarek, na przykład:Jak wykrywać fokus przeglądarki na urządzeniach mobilnych?

  • window.onfocus() ma/nie ogień, gdy zyski przeglądarka skupić
  • window.onfocus() ma/nie ognia, gdy karty są włączone w przeglądarce
  • Javascript jest/nie jest zawieszony pomiędzy przełącznikami zawleczki i/lub przełączniki od przeglądarce

Najlepsze, co udało mi się zrobić do tej pory, to zestaw heurystyk, które oglądają dostępne wydarzenia + kiedy było interakcja użytkownika ze stroną, ale jest niezgrabna i skutkuje przypadkami, w których użytkownik wraca na stronę i musi ręcznie odświeżyć. Nie najlepiej.

Jakieś sprytne techniki rozwiązania tego problemu?

+0

Alternatywnym rozwiązaniem może być sprawdzenie danych wprowadzanych przez użytkownika. A może ustawisz bieżący czas w zmiennej za każdym razem, gdy użytkownik wejdzie w interakcję ze stroną. W ten sposób możesz stworzyć regułę, która wyzwala wywołanie ajax, jeśli strona była używana przez ostatnią minutę lub dwie. –

+0

Obecnie robię to. Pomaga, ale w mojej aplikacji jest przypadek, w którym użytkownik po prostu przełącza się na stronę internetową lub odblokowuje swój telefon, aby sprawdzić status (nie wymaga interakcji). – LVB

Odpowiedz

4

Jeśli chcesz się tylko dowiedzieć, czy okno przeglądarki jest nieostre, użyj funkcji requestAnimationFrame.

window.requestAnimFrame = window.requestAnimationFrame || 
          window.mozRequestAnimationFrame || 
          <add browsers here> 

Następnie w kodzie

var lastupdate = new Date() 
(function loop() { 
     var now = new Date(); 

     if (now - lastupdate > <some treshold like 1 second>) { 
      // browser was suspended and did come back to focus 
     } 
     lastupdate = now; 

     window.requestAnimFrame(loop); 
})(); 

Sztuką jest, że przeglądarki nie dać ramkę animacji czy zakładka lub okno jest nieostry. Normalny setInterval i setTimeouts nadal będą działały. Pętla będzie działać nieprzerwanie po ustawieniu ostrości okna, ale narzut jest minimalny, na przykład w urządzeniach przenośnych nazywany jest 3-5 razy na sekundę.

+0

Spójrz na to. Moje bezpośrednie pytanie (bez badania) byłoby tym, jak bardzo jest to wspierane. Dzięki. – LVB

+2

Działa to w urządzeniach IE9, Firefox, Chrome, Safari, Android i iOS (również w większości innych telefonów komórkowych). IT nie działa AFAIK w żadnej starszej przeglądarce, która nie obsługuje płótna HTML5. –

+1

Ta lista nie jest dobrze obsługiwana w przeglądarkach mobilnych. http://caniuse.com/#feat=requestanimationframe ... Ale post daje jaśniejszy widok: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ – LVB