navegador - como activar javascript en mi celular
¿Cómo los navegadores pausan/cambian Javascript cuando la pestaña o ventana no está activa? (2)
Antecedentes: estoy haciendo algunas pruebas de interfaz de usuario que necesitan detectar si la gente está prestando atención o no. Pero, esta pregunta no se trata de la API de visibilidad de la página .
Específicamente, me gustaría saber cómo se verá afectado mi código JavaScript si la pestaña actual no está activa o si la ventana del navegador no está activa en diferentes navegadores. He desenterrado lo siguiente hasta ahora:
- ios 5 pausa javascript cuando la pestaña no está activa
-
setInterval
ysetTimeout
se reducen cuando las pestañas no están activas , parece que esto comenzó a aparecer recientemente y puede estropear las pruebas de la unidad de Jasmine, en otras cosas. -
requestAnimationFrame
se ralentiza cuando la pestaña no está activa (razonable, no se puede pensar por qué esto afectaría demasiado a alguien)
Tengo las siguientes preguntas:
- Además de los navegadores móviles, ¿los navegadores de escritorio detienen la ejecución de JS cuando una pestaña no está activa? ¿Cuándo y qué navegadores?
- ¿Qué navegadores reducen el
setInterval
repeat? ¿Se ha reducido a un límite o a un porcentaje? Por ejemplo, si tengo una repetición de 10ms frente a una repetición de 5000ms, ¿cómo se verá afectado cada uno? - ¿Ocurren estos cambios si la ventana está desenfocada, en lugar de solo la pestaña? (Me imagino que sería más difícil de detectar, ya que requiere la API del sistema operativo).
- ¿Hay algún otro efecto que no se observe en una pestaña activa? ¿Podrían estropear las cosas que de otro modo se ejecutarían correctamente (es decir, las pruebas de jazmín antes mencionadas)?
Prueba uno
He escrito una prueba específicamente para este propósito:
Distribución de frecuencia de fotogramas: setInterval vs requestAnimationFrame
Nota: Esta prueba consume bastante CPU. requestAnimationFrame
no es compatible con IE 9- y Opera 12-.
La prueba registra el tiempo real que tarda un setInterval
y requestAnimationFrame
en ejecutarse en diferentes navegadores, y le proporciona los resultados en forma de una distribución. Puede cambiar el número de milisegundos para setInterval
para ver cómo se ejecuta en diferentes configuraciones. setTimeout
funciona de manera similar a un setInterval
con respecto a los retrasos. requestAnimationFrame
generalmente está predeterminado a 60 fps dependiendo del navegador. Para ver qué sucede cuando cambia a una pestaña diferente o tiene una ventana inactiva, simplemente abra la página, cambie a una pestaña diferente y espere un momento. Continuará registrando el tiempo real que lleva para estas funciones en una pestaña inactiva.
Prueba dos
Otra forma de probarlo es registrar la marca de tiempo repetidamente con setInterval
y requestAnimationFrame
y verlo en una consola separada. Puede ver con qué frecuencia se actualiza (o si alguna vez se actualiza) cuando desactiva la pestaña o la ventana.
Resultados
Cromo
Chrome limita el intervalo mínimo de setInterval
a alrededor de 1000ms cuando la pestaña está inactiva. Si el intervalo es superior a 1000 ms, se ejecutará en el intervalo especificado. No importa si la ventana está desenfocada, el intervalo está limitado solo cuando cambia a una pestaña diferente. requestAnimationFrame
está en pausa cuando la pestaña está inactiva.
// Provides control over the minimum timer interval for background tabs.
const double kBackgroundTabTimerInterval = 1.0;
https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
De forma similar a Chrome, Firefox limita el intervalo mínimo de setInterval
a alrededor de 1000 ms cuando la pestaña (no la ventana) está inactiva. Sin embargo, requestAnimationFrame
ejecuta exponencialmente más lento cuando la pestaña está inactiva, con cada cuadro tomando 1s, 2s, 4s, 8s y así sucesivamente.
// The default shortest interval/timeout we permit
#define DEFAULT_MIN_TIMEOUT_VALUE 4 // 4ms
#define DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms
https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
explorador de Internet
IE no limita el retraso en setInterval
cuando la pestaña está inactiva, pero pausa requestAnimationFrame
en pestañas inactivas. No importa si la ventana está desenfocada o no.
Borde
A partir del Edge 14, setInterval
tiene un tope de 1000 ms en pestañas inactivas. requestAnimationFrame
siempre se pausa en pestañas inactivas.
Safari
Al igual que Chrome, Safari setInterval
a 1000 ms cuando la pestaña está inactiva. requestAnimationFrame
está en pausa.
Ópera
Desde la adopción del motor Webkit, Opera muestra el mismo comportamiento que Chrome. setInterval
tiene un tope de 1000 ms y requestAnimationFrame
se pausa cuando la pestaña está inactiva.
Resumen
Intervalos de repetición para pestañas inactivas:
setInterval requestAnimationFrame Chrome 9- not affected not supported 10 not affected paused 11+ >=1000ms paused Firefox 3- not affected not supported 4 not affected 1s 5+ >=1000ms 2ns (n = number of frames since inactivity) IE 9- not affected not supported 10+ not affected paused Edge 13- not affected paused 14+ >=1000ms paused Safari 5- not affected not supported 6 not affected paused 7+ >=1000ms paused Opera 12- not affected not supported 15+ >=1000ms paused
Lo que observé: en pestañas inactivas en Chrome , todo su setTimeout
(debe ser el mismo para setInterval
) que espera menos de 1000ms se redondea a 1000ms . Creo que los tiempos de espera más largos no se modifican.
Parece ser el comportamiento desde Chrome 11 y Firefox 5.0 : https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout#Inactive_tabs
Además, no creo que se comporte de esta manera cuando toda la ventana está inactiva (pero parece bastante fácil de investigar).