2010-04-27 17 views
56

Necesito saber si el usuario está actualmente viendo una pestaña o no en Google Chrome. Intenté usar el desenfoque de eventos y el enfoque enlazado a la ventana, pero solo el desenfoque parece estar funcionando correctamente.¿Cómo detectar cuando una pestaña está enfocada o no en Chrome con Javascript?

window.addEventListener('focus', function() { 
    document.title = 'focused'; 
}); 

window.addEventListener('blur', function() { 
    document.title = 'not focused'; 
}); 

El evento raro enfoque funciona, sólo a veces. Si cambio a otra pestaña y viceversa, el evento de enfoque no se activará. Pero si hago clic en la barra de direcciones y vuelvo a la página, lo hará. O si cambio a otro programa y vuelvo a Chrome, se activará si la pestaña está enfocada actualmente.

+0

¿trató de unir a esos eventos 'docment' en lugar de' window'? – Crozin

+0

No estoy seguro de si afecta la detección de eventos, pero la acción 'window.focus' está desactivada (o al menos con errores) en Chrome. Ver [aquí] (http://code.google.com/p/chromium/issues/detail?id=1674) y [aquí] (http://stackoverflow.com/questions/2703314/in-google-chrome- how-do-i-bring-an-existing-popup-window-to-the-front-using-java) para más. – brahn

+0

No funciona con el documento tampoco y esto es para el evento de enfoque, no la acción de enfoque. Creo que voy a cambiar mi enfoque de esto y cambiar el evento a mouseover o desplazamiento de la ventana. Para este escenario, es apropiado. – fent

Respuesta

96

2015 actualización: La nueva forma de HTML5 con la API de visibilidad (tomado del comentario de Blowsie):

document.addEventListener('visibilitychange', function(){ 
    document.title = document.hidden; // change tab text for demo 
}) 

El código de su creador original da (en la pregunta) ahora trabaja, a partir de 2011 :

window.addEventListener('focus', function() { 
    document.title = 'focused'; 
}); 

window.addEventListener('blur', function() { 
    document.title = 'not focused'; 
}); 

edición: a partir de unos meses más tarde en Chrome 14, este seguirá funcionando, pero el el usuario debe haber interactuado con la página haciendo clic en cualquier lugar de la ventana al menos una vez. Simplemente desplazarse y eso es insuficiente para que esto funcione. Hacer window.focus() no hace que esto funcione automáticamente tampoco. Si alguien sabe de una solución alternativa, por favor mencione.

+0

Tienes razón, lo hace. – fent

+15

¡insignia de Woohoo, Nigromante! – ninjagecko

+1

La forma de hacer que esto funcione sin que el usuario tenga que hacer clic en algún lugar primero es agregar "window.focus()" al evento window.onload. El efecto secundario de esto es que si la ventana es el objetivo de un enlace y ya estaba abierta detrás de la ventana actual, se llevará al frente. Tenga en cuenta que esta solución solo detecta pérdida de foco, no que haya sido causada por el cambio de pestañas. Por ejemplo, si la pérdida de foco se debe a que el usuario hace clic dentro de un iframe, debe eliminarlo: –

2

Podría funcionar después de todo, me picó la curiosidad y escribí este código:

... 
setInterval (updateSize, 500); 
function updateSize(){ 
    if(window.outerHeight == window.innerHeight){ 
    document.title = 'not focused';    
    } else { 
    document.title = 'focused'; 
    } 

    document.getElementById("arthur").innerHTML = window.outerHeight + " - " + window.innerHeight; 
} 
... 
<div id="arthur"> 
    dent 
</div> 

Este código hace Precisa lo que quiere, sino en una manera fea. La cuestión es que Chrome parece ignorar el cambio de título de vez en cuando (al cambiar a la pestaña y mantener presionado el botón del mouse durante 1 segundo, parece que siempre crea este efecto).

Obtendrá diferentes valores en la pantalla, pero su título no cambiará.

conclusión: ¡Hagas lo que hagas, no confíes en el resultado al probarlo!

+0

El título cambia instantáneamente para mí. Si cambio los eventos a mouseover y mouseout obtengo resultados instantáneos. – fent

+0

De todos modos, gracias por la parte (window.outerHeight == window.innerHeight). Para este proyecto en particular, solo necesito saber si el usuario está actualmente enfocado o no. No es necesario verificar constantemente, y tu código funciona. – fent

+1

Esto ya no funciona, a partir de 2011. – ninjagecko

0

He encontrado que la adición de onblur = y onfocus = eventos para Inline por alto el tema:

-2

en cromo puede ejecutar una secuencia de comandos de fondo con un tiempo de espera de menos de 1 segundo, y cuando la pestaña no tiene foco Chrome solo lo ejecutará cada segundo. Ejemplo;

Esto no funciona en Firefox u Opera. No sé sobre otros navegadores, pero dudo que funcione allí también.

var currentDate = new Date(); 
var a = currentDate.getTime(); 

function test() { 
    var currentDate = new Date(); 
    var b = currentDate.getTime(); 
var c = b - a; 
    if (c > 900) { 
     //Tab does not have focus. 
    } else { 
     //It does 
    } 
    a = b; 
    setTimeout("test()",800); 
} 



setTimeout("test()",1); 
+2

No me gusta la idea de usar intervalos para algo que debería ser evitado. Y tenga en cuenta que debe usar 'setTimeout (test, 800)'. Si le das una cadena, 'eval()' it, que es mucho más lenta. – fent

0

Esto podría trabajar con jQuery

$(function() { 
    $(window).focus(function() { 
     console.log('Focus'); 
    }); 

    $(window).blur(function() { 
     console.log('Blur'); 
    }); 
}); 
+0

Creo que esto no ayudará porque, como informó el navegador, NO activa la función de evento que ha adjuntado en 'blur'. Así que como en su ejemplo y código 'console.log ('Blur');' NO se llamará en algunas situaciones. – psulek

1

Para cualquier persona que quiera cambiar los títulos de página en la falta de definición y luego volver a la página de título original de enfoque:

// Swapping page titles on blur 
var originalPageTitle = document.title; 

window.addEventListener('blur', function(){ 
    document.title = 'Don\'t forget to read this...'; 
}); 

window.addEventListener('focus', function(){ 
    document.title = originalPageTitle; 
}); 
Cuestiones relacionadas