2009-07-31 19 views
8

Tengo un temporizador de JavaScript que realiza solicitudes XMLHTTP de forma constante (una vez cada 10 segundos). Me encantaría poder pausar el temporizador cuando la ventana o pestaña pierda el foco.¿Existe alguna manera confiable de determinar si una pestaña o ventana del navegador está inactiva o no está enfocada?

Soy plenamente consciente de los eventos onFocus y onBlur en el objeto window, pero no se activan de forma fiable en todos los navegadores. Por ejemplo, in Safari, tabs don't trigger the events.

simple código de abajo destila la funcionalidad Busco:

<html> 
    <head> 
    <title>Testing</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script> 
    </head> 
    <body> 
    <div id="console"></div> 
    <script type="text/javascript"> 
     window.onfocus = function(event) { 
     $('console').insert('Window gained focus<br />'); 
     } 

     window.onblur = function(event) { 
     $('console').insert('Window lost focus<br />'); 
     } 
    </script> 
    </body> 
</html> 

¿Alguien por ahí tiene una técnica para determinar cuando una ventana o pestaña del navegador pierde/ganancias enfoque que funciona en todos los navegadores populares?

+0

En mi experiencia, esto no se puede solucionar con flash. http://stackoverflow.com/questions/1099063/detecting-embedded-object-focus-in-safari – jedierikb

+0

posible duplicado de [¿Hay alguna manera de detectar si una ventana del navegador no está activa actualmente?] (http: // stackoverflow .com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-is-not-currently-active) – rvighne

Respuesta

3

El código anterior está funcionando bien en Safari v3.0.4 (WebKit 530+), el error ha sido resuelto al parecer. Lo he comprobado en Google Chrome v3.0.195.27 y tiene el mismo error de Safari, aunque tiene una versión más nueva de WebKit.

+0

Tiene razón en que las versiones recientes de Safari manejan esto, y Chrome no. Solo voy a decir que para mi propósito, el apoyo de 3 de los 4 mejores no es tan malo. –

+0

Chrome v3.0.195.38 se comporta de manera extraña. Dispara los eventos en el interruptor de tabulación, pero solo cuando se produce al menos un cambio de ventana. – detj

0

Mis anteriores intentos desesperados de encontrar tal cosa me han llevado a la conclusión de que no existe tal animal.

Oh, cómo me gustaría estar equivocado.

2

Hay otra pregunta de desbordamiento de pila con respecto a este tema. No abordaron el problema de navegación con pestañas allí. Proporcionan un enlace que entra en detalle, aunque sin usar jquery.

Is there a way to detect if a browser window is not currently active?

no creo eventos de enfoque/desenfoque trabajan con navegación por pestañas en Safari en absoluto. Algunas personas han sugerido eventos de mouse, como mouseleave/mouseenter para esto.

Tengo algunos problemas de IU como este, por lo que si descubro algo lo seguiré aquí.

-1

Una cosa a tener en cuenta es que pestañafocus/blur eventos que están siendo bloqueados por los proveedores de navegadores es, posiblemente, una manera de proteger a los usuarios. Algunos navegadores permiten alert() -style pop-ups (e incluso, creo, un método focus()) para hacer que una pestaña recupere el foco. El bloqueo de los eventos focus/blur para cambiar de pestaña podría ser similar a la protección contra, por ejemplo, ventanas emergentes no solicitadas y tamaño/posicionamiento/cierre de ventana.

+0

Quiere decir escuchar esos eventos, no dispararlos él mismo. – aehlke

0
<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> 
+2

Es bueno proporcionar un código que podría ayudar a resolver un problema. Pero en este sitio esperamos respuestas para explicar el por qué y el cómo. Por favor, agrega algunas precisiones a tu publicación. –

Cuestiones relacionadas