Contexte: je fais des tests d'interface utilisateur qui doivent détecter si les gens font attention ou non. Mais cette question ne concerne pas l'API de visibilité de page .
Plus précisément, j'aimerais savoir comment mon code Javascript sera affecté si l'onglet actuel n'est pas actif, ou si la fenêtre du navigateur n'est pas active, dans différents navigateurs. J'ai découvert ce qui suit jusqu'à présent:
- ios 5 met javascript en pause lorsque l'onglet n'est pas actif
setInterval
et lesetTimeout
délai est réduit lorsque les onglets ne sont pas actifs - il semble que cela vient de commencer à apparaître récemment et peut gâcher les tests unitaires de Jasmine, autour d'autres choses.requestAnimationFrame
est ralenti lorsque l'onglet n'est pas actif (raisonnable, je ne vois pas pourquoi cela affecterait trop quelqu'un)
J'ai les questions suivantes:
- À part les navigateurs mobiles, les navigateurs de bureau mettent-ils en pause l'exécution de JS lorsqu'un onglet n'est pas actif? Quand et quels navigateurs?
- Quels navigateurs réduisent la
setInterval
répétition? Est-il simplement réduit à une limite ou à un pourcentage? Par exemple, si j'ai une répétition de 10 ms par rapport à une répétition de 5000 ms, comment chacun sera-t-il affecté? - Ces changements se produisent-ils si la fenêtre est floue, par opposition à l'onglet uniquement? (J'imagine que ce serait plus difficile à détecter, car cela nécessite l'API du système d'exploitation.)
- Y a-t-il d'autres effets qui ne seraient pas observés dans un onglet actif? Pourraient-ils gâcher des choses qui autrement s'exécuteraient correctement (c'est-à-dire les tests Jasmine susmentionnés)?
javascript
browser
Andrew Mao
la source
la source
setInterval
/setTimeout
times sous 1000ms sont changés en 1000ms lorsque l'onglet / la fenêtre est flouesetInterval
/setTimeout
fois sous 1000ms sont changés en 1000ms lorsque l'onglet / la fenêtre est floue. Pas clair ce que vous avez essayé de transmettreRéponses:
Test un
J'ai écrit un test spécialement à cet effet:
Distribution de la fréquence d'images: setInterval vs requestAnimationFrame
Remarque: ce test est assez gourmand en ressources processeur.
requestAnimationFrame
n'est pas pris en charge par IE 9- et Opera 12-.Le test enregistre le temps réel nécessaire à un
setInterval
etrequestAnimationFrame
pour s'exécuter dans différents navigateurs et vous donne les résultats sous la forme d'une distribution. Vous pouvez modifier le nombre de millisecondes poursetInterval
voir comment il s'exécute sous différents paramètres.setTimeout
fonctionne de la même manière quesetInterval
pour les retards.requestAnimationFrame
généralement par défaut au 60fps selon le navigateur. Pour voir ce qui se passe lorsque vous passez à un autre onglet ou que vous avez une fenêtre inactive, ouvrez simplement la page, passez à un autre onglet et attendez un moment. Il continuera à enregistrer le temps réel nécessaire pour ces fonctions dans un onglet inactif.Test deux
Une autre façon de le tester consiste à enregistrer l'horodatage à plusieurs reprises avec
setInterval
etrequestAnimationFrame
et à l'afficher dans une console détachée. Vous pouvez voir à quelle fréquence il est mis à jour (ou s'il a déjà été mis à jour) lorsque vous désactivez l'onglet ou la fenêtre.setInterval
requestAnimationFrame
Résultats
Chrome
Chrome limite l'intervalle minimum
setInterval
à environ 1000 ms lorsque l'onglet est inactif. Si l'intervalle est supérieur à 1000 ms, il s'exécutera à l'intervalle spécifié. Peu importe si la fenêtre est floue, l'intervalle est limité uniquement lorsque vous passez à un autre onglet.requestAnimationFrame
est suspendu lorsque l'onglet est inactif.https://codereview.chromium.org/6546021/patch/1001/2001
Firefox À l'
instar de Chrome, Firefox limite l'intervalle minimum d'
setInterval
environ 1000 ms lorsque l'onglet (et non la fenêtre) est inactif. Cependant,requestAnimationFrame
s'exécute de manière exponentielle plus lente lorsque l'onglet est inactif, chaque image prenant 1s, 2s, 4s, 8s, etc.https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
IE ne limite pas le délai d'
setInterval
inactivité de l'onglet, mais il s'interromptrequestAnimationFrame
dans les onglets inactifs. Peu importe que la fenêtre soit floue ou non.Edge
À partir de Edge 14,
setInterval
est plafonné à 1000 ms dans les onglets inactifs.requestAnimationFrame
est toujours en pause dans les onglets inactifs.Safari
Tout comme Chrome, Safari plafonne
setInterval
à 1000 ms lorsque l'onglet est inactif.requestAnimationFrame
est également mis en pause.Opera
Depuis l'adoption du moteur Webkit, Opera présente le même comportement que Chrome.
setInterval
est plafonné à 1000 ms etrequestAnimationFrame
est mis en pause lorsque l'onglet est inactif.Résumé
Répétition des intervalles pour les onglets inactifs:
la source
setInterval
etrequestAnimationFrame
?setInterval
etrequestAnimationFrame
. Ce que je sais, c'est qu'ilsetTimeout
se comporte de la même manièresetInterval
, en ce sens qu'ils ont tous deux le même intervalle d'arrière-plan minimum dans Firefox et Chrome, et aucune limite apparente dans les autres navigateurs.about:config
dans le navigateur et en changeant ladom.min_background_timeout_value
valeur en autre chose que 1000.requestAnimationFrame
est appelée si l'utilisateur change simplement d'application (Alt + Tab hors de Chrome). Tant que l'onglet est actif dans Chrome, la "fréquence d'images" est plus ou moins constante.Ce que j'ai observé: sur les onglets inactifs dans Chrome , toutes vos attentes
setTimeout
(doivent être identiques poursetInterval
) moins de 1000 ms sont arrondies à 1000 ms . Je pense que les délais d'attente plus longs ne sont pas modifiés.Semble être le comportement depuis Chrome 11 et Firefox 5.0 : https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout#Inactive_tabs
De plus, je ne pense pas que cela se comporte de cette façon lorsque la fenêtre entière est inactive (mais cela semble assez facile à étudier).
la source
focus
et lesblur
événements semblent détecter à la fois les changements d'onglet et de fenêtre, de sorte qu'il pourrait fonctionner dans les deux sens. Mais je me demande comment la fenêtre détecte si elle est réellement visible ou non.Une nouvelle réponse pour compléter celles-ci: sur chrome 78.0.3904.108, je remarque que tous ces délais (pas seulement ceux inférieurs à 1000 ms) prennent un peu plus de temps que prévu lorsque je passe à un onglet différent, puis que je reviens. Le comportement que je vois est plus correctement décrit comme "Tous les délais d'attente sur les onglets inactifs peuvent être retardés d'une certaine quantité supplémentaire, jusqu'à un maximum de 1000 ms." :
la source