2011-11-22 17 views
7

El título se explica a sí mismo. ¿Cómo puedo detectar si una página web se ha ido al fondo?¿Cómo se puede detectar si una página está en segundo plano o en primer plano con jquery/javascript?

Estoy implementando una aplicación de chat y usaré esta información para decidir mostrar las notificaciones de los mensajes nuevos. Supongo que GMail usa algo así. Si la página está en segundo plano, muestra las notificaciones de escritorio (en cromo), si no, no las muestra.

+0

decir: * Si se abre una ventana emergente CHAT * ? –

+0

Piensa que estás usando gmail, leyendo correos electrónicos, etc. Y recibiste un mensaje, en ese caso, gmail no muestra ninguna notificación de escritorio (porque la página está en primer plano) Pero si estás navegando en otros sitios mientras gmail está todavía abierto, estás advertido por una notificación de escritorio. ¿Cómo entiende Gmail su estado? –

Respuesta

10

Sé que la respuesta ya se ha seleccionado, pero quería compartir otra.

Puede usar el método hasFocus en el document para ver si tiene el foco. No hay razón para establecer su propia variable.

Aquí hay algunos códigos de prueba de concepto. jsFiddle está en la parte inferior. Cada 3 segundos comprobará si la ventana tiene foco o no, mostrando verdadero o falso.

HTML:

<p>This will show if the document has focus every three seconds</p> 
<button id="go">Go</button> 
<button id="stop">Stop</button> 

<ul id="active_log"> 
</ul> 

CSS:

#stop { display: none; } 

Javascript en el interior en el documento listo:

var timeout = null; 

var checkActive = function() { 
    var isActive = window.document.hasFocus(), 
     $activity = $("<li />").text(isActive.toString()); 

    $('#active_log').prepend($activity).find('li:nth-child(n+6)').fadeOut(function() { 
     $(this).remove(); 
    }); 

    timeout = setTimeout(checkActive, 3000); 
} 

$('#go').click(function() { 
    $(this).hide().siblings('button').show(); 
    checkActive(); 
}); 

$('#stop').click(function() { 
    $(this).hide().siblings('button').show(); 
    clearTimeout(timeout); 
    timeout = null; 
}); 

http://jsfiddle.net/natedavisolds/2D7za/1/

+0

Usaré window.document.hasFocus() para decidir mostrar la notificación. Gracias por inspirar! –

+0

¡Excelente consejo! Una advertencia que hay que tener en cuenta es que solo comprueba si el * documento * tiene foco, parece obvio, pero esto devuelve 'falso' si otro marco en la página tiene foco (verificable en el jsFiddle) o si la barra de direcciones tiene atención. –

+0

Definitivamente este será el enfoque cruzado más útil al menos por el momento ... podría valer la pena señalar que este enfoque puede arrojar falsos negativos (si la página usa múltiples marcos, o el usuario coloca el foco fuera del documento o fuera del navegador por completo, sin ocultar la página), pero la API experimental de Google hace lo contrario, dando falsos positivos para las pestañas de primer plano que están ocultas por completo por otras ventanas. Entonces, el mejor enfoque para usar también podría depender de si los falsos positivos o negativos son más preocupantes. –

4

Puede enlazar a los eventos windowblur y focus. Aquí es un fragmento de código an app I wrote:

$(window).bind("blur", function() { 
    Chatterbox.set_focused(false); 
}); 

$(window).bind("focus", function() { 
    Chatterbox.set_focused(true); 
}); 
7

Ahora hay un page visibility API para esto, y que está bien soportado por todas las versiones más recientes de los principales navegadores en Windows, Mac OS X y Linux (aunque no tengo no probado realmente todos los navegadores con una parte justa del mercado de los navegadores Linux).

La API de visibilidad de página es ahora el mejor enfoque para controlar la visibilidad; las únicas advertencias son que no puede decirle qué partes de la ventana del navegador son visibles (solo que no hay nada visible o al menos una parte), y ese soporte solo ha estado presente desde 2016 en Linux, 2015 en Mac y 2014 (posiblemente antes) en Windows.

Mientras se lanzaba la compatibilidad, un falso negativo era raro, pero se producían falsos positivos en algunas plataformas; por ejemplo, en 2014, OSX presentó versiones en miniatura de aplicaciones minimizadas en el dock, y como resultado de la forma en que esto se hizo, una aplicación no pudo determinar fácilmente si se minimizó, ya que aún se le pidió que pintara la pantalla. Linux tuvo complicaciones al saber si su aplicación estaba en un espacio de trabajo no visible, y si otra ventana estaba ocluyéndola.

El primer borrador público se publicó en junio de 2011 y alcanzó el estado de "recomendación" en mayo de 2013. En marzo de 2014, las versiones más recientes de todos los navegadores principales de Windows tenían soporte completo para el estándar. El soporte completo para todos los principales navegadores de Mac se logró en abril de 2015. Se logró el soporte de Linux para al menos Chromium en agosto de 2016 (cuando se cerró Chromium issue 293128); aunque no los he probado, espero que otros navegadores Linux hayan seguido el mismo ritmo, ya que la parte más difícil del trabajo parece haber sido ajustar el OS/GUI para sacar contratos y API para saber si su aplicación de escritorio es visible.

+0

Muy interesante, especialmente al poder detectar el estado "prerender", que me ha mordido antes ... –

+0

No conocía esa API, gracias. Pero parece que no es tan lógico usar en producción una API tan experimental. –

+1

Solo para salvar a todos un par de clics: http://caniuse.com/#feat=pagevisibility –

Cuestiones relacionadas