2012-01-04 14 views
13

L'applicazione che sto sviluppando è basata su jQuery Mobile e alcuni Ajax per aggiornare parti della pagina. Come i siti che utilizzano l'aggiornamento automatico, voglio interrompere l'aggiornamento dopo alcune condizioni (tempo/visibilità/ecc.) In modo che il mio server non sia bombardato da richieste non necessarie. L'applicazione ha una schermata di stato che viene comunemente controllata dall'utente, e idealmente i miei script saprebbero che la finestra del browser è stata messa a fuoco e sarebbe un buon momento per aggiornare. Ho fatto questo prima nella webapps desktop, ma sto notando un sacco di variazione sul lato mobile tra diverse piattaforme e browser, ad esempio:Come rilevare lo stato attivo del browser sui dispositivi mobili?

  • window.onfocus() non/si attiva quando i guadagni del browser concentrano
  • window.onfocus() è/non attivano quando le schede vengono commutati in un browser
  • JavaScript è/non sospeso tra switch scheda e/o interruttori lontano dal browser

Il meglio che ho potuto fare finora è un insieme di euristiche che guardano gli eventi disponibili + quando c'era interazione utente tect con la pagina, ma è goffo e risultati nei casi in cui l'utente salta di nuovo alla pagina e deve aggiornare manualmente. Non buono.

Qualche tecnica intelligente per risolvere questo?

+0

Una soluzione alternativa potrebbe essere quella di verificare l'input dell'utente. Che ne dici di impostare l'ora corrente in una variabile ogni volta che l'utente interagisce con la pagina. In questo modo è possibile creare una regola che attiva la chiamata ajax solo se la pagina è stata utilizzata per l'ultimo minuto o due. –

+0

Attualmente sto facendo questo. Aiuta, ma c'è il caso comune nella mia applicazione in cui l'utente passa semplicemente alla pagina web o sblocca il suo telefono per guardare lo stato (nessuna interazione richiesta). – LVB

risposta

4

Se si desidera sapere se la finestra del browser non è stata selezionata, utilizzare la funzione requestAnimationFrame.

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

Poi nel codice

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

trucco è, che i browser non danno frame di animazione se scheda o finestra è fuori fuoco. Normale setInterval e setTimeouts continueranno a funzionare. Questo ciclo verrà eseguito continuamente quando la finestra è a fuoco, ma il sovraccarico è minimo, è chiamato forse 3-5 volte al secondo nei dispositivi mobili.

+0

Darò un'occhiata a questo. La mia domanda immediata (senza indagini) sarebbe quanto ampiamente questo è supportato. Grazie. – LVB

+2

Funziona con IE9, Firefox, Chrome, Safari, dispositivi Android e iOS (anche nella maggior parte degli altri cellulari). L'IT non funziona con AFAIK in un browser precedente che non supporta la tela HTML5. –

+1

Secondo questo elenco, non è supportato nei browser mobili. http://caniuse.com/#feat=requestanimationframe ... Ma il post offre una visione più chiara: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ – LVB

Problemi correlati