8
votes

Existe-t-il un moyen fiable de déterminer si un onglet de navigateur ou une fenêtre est inactif ou non en mise au point?

J'ai une minuterie JavaScript qui fait des demandes XMLHTTP de manière constante (une fois toutes les 10 secondes). J'adorerais pouvoir mettre en pause la minuterie lorsque la fenêtre ou l'onglet perd la mise au point.

Je suis pleinement conscient du Onfocus et OnBlur Events sur le < Code> Fenêtre objet, mais ils ne tirent pas de manière fiable sur tous les navigateurs. Par exemple, dans Safari, onglets Ne déclenchez pas les événements .

Code simple ci-dessous distille la fonctionnalité que je recherche: xxx

est-ce que quelqu'un existe une technique pour déterminer lorsqu'une fenêtre de navigateur ou l'onglet perd / gains axée qui fonctionne dans tous les navigateurs populaires?


5 Réponses :


0
votes

Mes anciennes tentatives désespérées de trouver une telle chose m'ont amené à conclure qu'il n'y a pas d'animal de ce type.

Oh, comment j'aimerais avoir tort.


0 commentaires

2
votes

Il existe une autre question de dépassement de pile concernant ce sujet. Ils n'ont pas abordé la question de la navigation à onglets là-bas. Ils donnent un lien qui passe dans certains détails, bien que sans utiliser jQuery.

est Il existe un moyen de détecter si une fenêtre de navigateur n'est pas active actuellement?

Je ne pense pas que les événements de FOCUS / BLUR fonctionnent avec une navigation à onglets dans Safari. Certaines personnes ont suggéré des événements de souris, comme Mouseleave / Mouseener pour cela.

J'ai des problèmes d'interface utilisateur comme celle-ci moi-même, alors si je découvre tout ce que je vais suivre ici.


0 commentaires

-1
votes

Une chose à considérer est que TAB FOCUS / BLUR Événements étant bloqués par les fournisseurs de navigateurs est peut-être un moyen de protéger les utilisateurs. Certains navigateurs autorisent alerte () -Style popups (et même, je crois, un focus () méthode) pour que l'onglet reprenne la mise au point. Blocage de la mise au point / Blur Événements pour l'onglet La commutation d'onglet pourrait être semblable à la protection contre, par exemple, des contextuels non référés et de la taille de la fenêtre / positionnement / fermeture / fermeture / fermeture.


1 commentaires

Il signifie écouter ces événements, ne pas les tirer lui-même.



3
votes

Le code ci-dessus fonctionne bien dans Safari v3.0.4 (WebKit 530+), le bogue a été résolu. Je l'ai vérifié dans Google Chrome v3.0.0.195.27 et il possède le même bogue de safari, bien qu'il ait une nouvelle version de WebKit.


2 commentaires

Vous avez raison que les versions récentes de Safari gèrent cela et Chrome ne le fait pas. Je vais juste dire que pour mes objectifs, le soutien de 3 des 4 meilleurs n'est pas si mal.


Chrome v3.0.195.38 se comporte étrangement. Il tire les événements sur l'interrupteur d'onglets mais uniquement lorsque au moins un commutateur de fenêtre se produit.



0
votes
<script>

    // Adapted slightly from Sam Dutton
    // Set name of hidden property and visibility change event
    // since some browsers only offer vendor-prefixed support
    var hidden, state, visibilityChange; 
    if (typeof document.hidden !== "undefined") {
        hidden = "hidden";
        visibilityChange = "visibilitychange";
        state = "visibilityState";
    } else if (typeof document.mozHidden !== "undefined") {
        hidden = "mozHidden";
        visibilityChange = "mozvisibilitychange";
        state = "mozVisibilityState";
    } else if (typeof document.msHidden !== "undefined") {
        hidden = "msHidden";
        visibilityChange = "msvisibilitychange";
        state = "msVisibilityState";
    } else if (typeof document.webkitHidden !== "undefined") {
        hidden = "webkitHidden";
        visibilityChange = "webkitvisibilitychange";
        state = "webkitVisibilityState";
    }

    // Add a listener that constantly changes the title
    document.addEventListener(visibilityChange, function() {
        document.title = document[state];
    }, false);

    // Set the initial value
    document.title = document[state];

</script>

1 commentaires

C'est bien de fournir du code qui pourrait aider à résoudre un problème. Mais dans ce site, nous attendons des réponses pour expliquer la raison pour laquelle et comment. Veuillez ajouter quelques précisions à votre message.