quantum navegador habilitar gratis como chrome celular actualizar activar javascript browser

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 y setTimeout 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).