2011-09-20 28 views
18

Tengo una presentación de diapositivas simple que he hecho en la página de inicio de un cliente, usando setInterval para sincronizar las rotaciones.Pausando setInterval cuando la página/navegador está fuera de foco

Para evitar que los navegadores para atornillar setInterval cuando la página no está en el foco (se está viendo otra pestaña, u otro programa), estoy usando:

function onBlur() { 
      clearInterval(play); 
     }; 

     function onFocus() { 

      mySlideRotateFunction(); 

     }; 

     if (/*@[email protected]*/false) { 
      document.onfocusin = onFocus; 
      document.onfocusout = onBlur; 
     } else { 
      window.onfocus = onFocus; 
      window.onblur = onBlur; 
     } 

Dónde mySlideRotateFunction establece el setInterval y corre algo de jQuery Si bien esto funciona la mayoría de las veces, me parece que, en ocasiones, parece que en Blur no se ha ejecutado, y cuando regreso a la página los tiempos se han "acumulado" y las rotaciones se vuelven locas.

No puedo determinar una causa de por qué sucede esto en ocasiones, y no en otras.

Mi pregunta: ¿hay un problema con mi código, y alguien tiene una mejor sugerencia para 'pausar' setInterval cuando la ventana del navegador está desenfocada?

Gracias

+0

Me encontré con el mismo problema que hace un tiempo que estaba trabajando en un proyecto: intentamos arreglar ese "error" molesto ... pero al final usamos el código tal como era ... porque podemos se reproduce cuando ocurre este comportamiento extraño :( +1 con suerte hay alguien por ahí con una solución :) – walialu

Respuesta

17

intentar algo como esto:

var myInterval; 
var interval_delay = 500; 
var is_interval_running = false; //Optional 

$(document).ready(function() { 
    $(window).focus(function() { 
     clearInterval(myInterval); // Clearing interval if for some reason it has not been cleared yet 
     if (!is_interval_running) //Optional 
      myInterval = setInterval(interval_function, interval_delay); 
    }).blur(function() { 
     clearInterval(myInterval); // Clearing interval on window blur 
     is_interval_running = false; //Optional 
    }); 
}); 

interval_function = function() { 
    is_interval_running = true; //Optional 
    // Code running while window is in focus 
} 

Algunas pruebas realizadas en IE9 y FF6

+0

¿Básicamente, agregar un segundo clearInterval por si acaso? Parece sensato, si clearInterval se está perdiendo. Voy a probar tu idea un poco, a ver si resuelve el error. –

+0

@MichaelWatson agregó un código adicional, lo marcó como "Opcional". Ese código podría proporcionar cierta seguridad adicional (al menos podría evitar que se ejecuten varios intervalos al mismo tiempo) –

+0

me gusta. Déjame darle un día más o menos de prueba y te dejaré saber si el error tonto aún se cuela. –

3

Inmediatamente dentro setInterval, colocan una comprobación para ver si el documento está enfocado. El intervalo continuará activando como de costumbre, pero el código interno solo se ejecutará si el documento está enfocado. Si la ventana se ve borrosa y luego se vuelve a enfocar, el intervalo continuará manteniendo el tiempo pero document.hasFocus() fue false durante ese tiempo, por lo que no es necesario que el navegador "alcance" ejecutando el bloque de código un montón de veces cuando se restablece el enfoque.

var timePerInterval = 7000; 
$(document).ready(function() { 
    setInterval(function(){ 
     if (document.hasFocus()) { 
      // code to be run every 7 seconds, but only when tab is focused 
     } 
    }, timePerInterval); 
}); 
Cuestiones relacionadas