2012-01-04 20 views
13

La aplicación que estoy desarrollando se basa en jQuery Mobile y algunos Ajax para actualizar partes de la página. Al igual que los sitios que utilizan la actualización automática, quiero detener la actualización después de alguna condición (hora/visibilidad/etc.) para que mi servidor no sea bombardeado con solicitudes innecesarias. La aplicación tiene una pantalla de estado que comúnmente verifica el usuario, e idealmente mis scripts sabrían que la ventana del navegador se ha enfocado y sería un buen momento para actualizar. He hecho esto antes en aplicaciones web de escritorio, pero estoy notando una gran cantidad de variación en el lado móvil entre diferentes plataformas y navegadores, por ejemplo:¿Cómo detectar el foco del navegador en dispositivos móviles?

  • window.onfocus() no/no disparar cuando las ganancias del navegador se centran
  • window.onfocus() no/no se activan cuando las pestañas se conectan en un navegador
  • Javascript está/no suspendido entre los interruptores de lengüeta y/o interruptores de distancia desde el navegador

Lo mejor que he podido hacer hasta ahora es un conjunto de heurísticas que analizan los eventos disponibles + cuando hubo interacción del usuario con la página, pero es torpe y los resultados en los casos en que el usuario salta de vuelta a la página y tiene que actualizar manualmente. No es bueno.

¿Alguna técnica inteligente para resolver esto?

+0

Una solución alternativa podría ser comprobar la entrada del usuario. ¿Qué tal si establece la hora actual en una variable cada vez que el usuario interactúa con la página? De esta forma, puede crear una regla que solo active la llamada ajax si la página se ha utilizado durante el último minuto o dos. –

+0

Actualmente estoy haciendo esto. Ayuda, pero existe el caso común en mi aplicación donde el usuario simplemente cambia a la página web o desbloquea su teléfono para ver el estado (no se requiere interacción). – LVB

Respuesta

4

Si solo quiere saber si la ventana del navegador ha estado desenfocada, use la función requestAnimationFrame.

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

Luego, en el código de

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

truco es, que los navegadores no dan fotograma de la animación si pestaña o ventana está fuera de foco. Normal setInterval y setTimeouts seguirán funcionando. Este ciclo se ejecutará continuamente cuando la ventana esté enfocada, pero la sobrecarga es mínima, se llama tal vez 3-5 veces por segundo en dispositivos móviles.

+0

Voy a echar un vistazo a esto. Mi pregunta inmediata (sin investigación) sería qué tan ampliamente se admite esto. Gracias. – LVB

+2

Esto funciona en IE9, Firefox, Chrome, Safari, Android y dispositivos iOS (también en la mayoría de los demás móviles). No funciona AFAIK en ningún navegador anterior que no sea compatible con HTML5 canvas. –

+1

Según esta lista, no está bien soportado en navegadores móviles. http://caniuse.com/#feat=requestanimationframe ... Pero la publicación ofrece una vista más brillante: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ – LVB

Cuestiones relacionadas