J'ai JavaScript qui fait régulièrement de l'activité. Lorsque l'utilisateur ne regarde pas le site (c'est-à-dire que la fenêtre ou l'onglet n'a pas le focus), ce serait bien de ne pas s'exécuter.
Existe-t-il un moyen de le faire en utilisant JavaScript?
Mon point de référence: Gmail Chat émet un son si la fenêtre que vous utilisez n'est pas active.
javascript
browser
focus
window
Luke Francl
la source
la source
requestAnimationFrame
API ou utilisez la fonctionnalité moderne selon laquelle la fréquence desetTimeout
/setInterval
est réduite lorsque la fenêtre n'est pas visible (1 seconde dans Chrome, par exemple).blur
/focus
dans les navigateurs qui ne la prennent pas en charge.blur
/focus
événements ... qui seront cependant d'une utilité limitée, car une fenêtre peut être inactive mais entièrement ou partiellement visible (il y a aussi des icônes de "prévisualisation" dans certaines barres de tâches que les gens s'attendent à continuer à être) mise à jour).Réponses:
Depuis la rédaction initiale de cette réponse, une nouvelle spécification a atteint le statut de recommandation grâce au W3C. L' API de visibilité des pages (sur MDN ) nous permet désormais de détecter plus précisément lorsqu'une page est masquée pour l'utilisateur.
Prise en charge actuelle du navigateur:
Le code suivant revient à la méthode de flou / focus moins fiable dans les navigateurs incompatibles:
onfocusin
etonfocusout
sont requis pour IE 9 et inférieur , tandis que tous les autres utilisentonfocus
etonblur
, à l'exception d'iOS, qui utiliseonpageshow
etonpagehide
.la source
focusin
etfocusout
de l'iframe à la fenêtre supérieure. Pour les nouveaux navigateurs, il vous suffirait de gérer les événementsfocus
etblur
sur chaquewindow
objet iframe . Vous devez utiliser le code mis à jour que je viens d'ajouter, qui couvrira au moins ces cas dans les nouveaux navigateurs.J'utiliserais jQuery car alors tout ce que vous avez à faire est le suivant:
Ou du moins, cela a fonctionné pour moi.
la source
window
focus sera perdu, ce qui est vrai, mais selon ce que votre intention pourrait ne pas être ce dont vous avez besoin.Il existe 3 méthodes typiques utilisées pour déterminer si l'utilisateur peut voir la page HTML, mais aucune ne fonctionne parfaitement:
L' API de visibilité de page du W3C est censée faire cela (prise en charge depuis: Firefox 10, MSIE 10, Chrome 13). Cependant, cette API ne déclenche des événements que lorsque l'onglet du navigateur est entièrement remplacé (par exemple lorsque l'utilisateur passe d'un onglet à un autre). L'API ne déclenche pas d'événements lorsque la visibilité ne peut pas être déterminée avec une précision de 100% (par exemple Alt + Tab pour passer à une autre application).
L'utilisation de méthodes basées sur le focus / flou vous donne beaucoup de faux positifs. Par exemple, si l'utilisateur affiche une fenêtre plus petite en haut de la fenêtre du navigateur, la fenêtre du navigateur perdra le focus (
onblur
surélevée) mais l'utilisateur est toujours en mesure de la voir (il doit donc être actualisé). Voir aussi http://javascript.info/tutorial/focusAfin d'améliorer les comportements imparfaits décrits ci-dessus, j'utilise une combinaison des 3 méthodes: API de visibilité W3C, puis focus / flou et méthodes d'activité utilisateur afin de réduire le taux de faux positifs. Cela permet de gérer les événements suivants:
Voici comment cela fonctionne: lorsque le document perd le focus, l'activité de l'utilisateur (comme le déplacement de la souris) sur le document est surveillée afin de déterminer si la fenêtre est visible ou non. La probabilité de visibilité de la page est inversement proportionnelle à l'heure de la dernière activité de l'utilisateur sur la page: si l'utilisateur ne fait aucune activité sur le document pendant une longue période, la page n'est probablement pas visible. Le code ci-dessous imite l'API W3C Page Visibility: il se comporte de la même manière mais a un petit taux de faux positifs. Il a l'avantage d'être multibrowser (testé sur Firefox 5, Firefox 10, MSIE 9, MSIE 7, Safari 5, Chrome 9).
Puisqu'il n'y a actuellement aucune solution multi-navigateur qui fonctionne sans faux positif, vous devriez mieux réfléchir à deux fois avant de désactiver l'activité périodique sur votre site Web.
la source
Il y a une bibliothèque soignée disponible sur GitHub:
https://github.com/serkanyersen/ifvisible.js
Exemple:
J'ai testé la version 1.0.1 sur tous les navigateurs que j'ai et je peux confirmer qu'elle fonctionne avec:
... et probablement toutes les versions plus récentes.
Ne fonctionne pas entièrement avec:
.now()
revient toujourstrue
pour moi)la source
Utilisation: API de visibilité de page
Puis-je utiliser ? http://caniuse.com/#feat=pagevisibility
la source
Je crée un chat Comet pour mon application et lorsque je reçois un message d'un autre utilisateur, j'utilise:
la source
document.hasFocus()
est le moyen le plus propre de le faire. Toutes les autres façons d'utiliser l'API de visibilité ou basée sur un événement ou de rechercher différents niveaux d'activité / manque d'activité de l'utilisateur deviennent trop compliquées et remplies de cas et de trous de bord. placez-le sur un intervalle simple et déclenchez un événement personnalisé lorsque les résultats changent. Exemple: jsfiddle.net/59utucz6/1J'ai commencé à utiliser la réponse wiki communautaire, mais j'ai réalisé qu'elle ne détectait pas les événements alt-tab dans Chrome. En effet, il utilise la première source d'événement disponible, et dans ce cas, c'est l'API de visibilité des pages, qui dans Chrome ne semble pas suivre les tabulations alt.
J'ai décidé de modifier un peu le script pour garder une trace de tous les événements possibles pour les changements de focus de page. Voici une fonction que vous pouvez ajouter:
Utilisez-le comme ceci:
Cette version écoute tous les différents événements de visibilité et déclenche un rappel si l'un d'eux provoque un changement. Les gestionnaires
focused
etunfocused
s'assurent que le rappel n'est pas appelé plusieurs fois si plusieurs API interceptent le même changement de visibilité.la source
document.hidden
etdocument.webkitHidden
. Sanselse
dans laif
construction, nous recevrions 2 rappels, n'est-ce pas?C'est vraiment délicat. Il ne semble pas y avoir de solution compte tenu des exigences suivantes.
Cela se produit parce que:
Compte tenu de ces restrictions, il est possible d'implémenter une solution qui combine - l'API de visibilité des pages - le flou / focus de la fenêtre - document.activeElement
Cela est capable de:
Lorsque l'iframe a le focus, vos événements flou / focus ne sont pas du tout invoqués et l'API de visibilité de la page ne se déclenche pas sur alt + tab.
J'ai construit sur la solution de @ AndyE et mis en œuvre cette (presque bonne) solution ici: https://dl.dropboxusercontent.com/u/2683925/estante-components/visibility_test1.html (désolé, j'ai eu quelques problèmes avec JSFiddle).
Ceci est également disponible sur Github: https://github.com/qmagico/estante-components
Cela fonctionne sur le chrome / chrome. Il fonctionne en quelque sorte sur Firefox, sauf qu'il ne charge pas le contenu iframe (une idée pourquoi?)
Quoi qu'il en soit, pour résoudre le dernier problème (4), la seule façon de le faire est d'écouter les événements de flou / focus sur l'iframe. Si vous avez un certain contrôle sur les iframes, vous pouvez utiliser l'API postMessage pour ce faire.
https://dl.dropboxusercontent.com/u/2683925/estante-components/visibility_test2.html
Je n'ai toujours pas testé cela avec suffisamment de navigateurs. Si vous pouvez trouver plus d'informations sur les cas où cela ne fonctionne pas, veuillez me le faire savoir dans les commentaires ci-dessous.
la source
http://jsfiddle.net/ARTsinn/JTxQY/
la source
cela fonctionne pour moi sur chrome 67, firefox 67,
la source
vous pouvez utiliser:
la source
En HTML 5, vous pouvez également utiliser:
onpageshow
: Script à exécuter lorsque la fenêtre devient visibleonpagehide
: Script à exécuter lorsque la fenêtre est masquéeVoir:
la source
Ceci est une adaptation de la réponse d'Andy E.
Cela fera une tâche, par exemple actualiser la page toutes les 30 secondes, mais uniquement si la page est visible et ciblée.
Si la visibilité ne peut pas être détectée, seule la mise au point sera utilisée.
Si l'utilisateur concentre la page, celle-ci sera mise à jour immédiatement
La page ne se mettra à jour que 30 secondes après tout appel ajax
la source
Pour une solution sans jQuery, consultez Visibility.js qui fournit des informations sur les états de trois pages
et aussi des wrappers pratiques pour setInterval
Une solution de rechange pour les navigateurs plus anciens (IE <10; iOS <7) est également disponible
la source
Une manière un peu plus compliquée serait d'utiliser
setInterval()
pour vérifier la position de la souris et comparer avec la dernière vérification. Si la souris n'a pas bougé dans un laps de temps défini, l'utilisateur est probablement inactif.Cela a l'avantage supplémentaire de dire si l'utilisateur est inactif, au lieu de simplement vérifier si la fenêtre n'est pas active.Comme de nombreuses personnes l'ont souligné, ce n'est pas toujours un bon moyen de vérifier si la fenêtre de l'utilisateur ou du navigateur est inactive, car l'utilisateur peut même ne pas utiliser la souris ou regarder une vidéo, ou similaire. Je suggère simplement une façon possible de vérifier l'inactivité.
la source
Pour angular.js, voici une directive (basée sur la réponse acceptée) qui permettra à votre contrôleur de réagir à un changement de visibilité:
Vous pouvez l'utiliser comme cet exemple:,
<div react-on-window-focus="refresh()">
oùrefresh()
est une fonction de portée dans la portée de tout contrôleur qui est dans la portée.la source
Voici une solution solide et moderne. (Court un doux 👌🏽)
Cela configurera un écouteur pour qu'il se déclenche lorsqu'un événement de visibilité est déclenché, ce qui pourrait être un focus ou un flou.
la source
Si vous souhaitez agir sur l' ensemble du flou du navigateur : comme je l'ai dit, si le navigateur perd le focus, aucun des événements suggérés ne se déclenche. Mon idée est de compter en boucle et de réinitialiser le compteur si un événement se déclenche. Si le compteur atteint une limite, je fais une location.href vers une autre page. Cela se déclenche également si vous travaillez sur des outils de développement.
Il s'agit d'un projet testé avec succès sur FF.
la source