2010-08-13 10 views
74

¿Cómo se prueba si el navegador tiene foco?JavaScript/jQuery: prueba si la ventana tiene foco

+0

Vea también http://stackoverflow.com/questions/483741/how-to-determine-which-html-page-element-has-focus que también puede responder a esta pregunta. –

+15

Pruebe 'document.hasFocus()', que devuelve un valor booleano. Está integrado en la especificación, por lo que se puede hacer sin jQuery. –

Respuesta

74

No he probado esto en otros navegadores, pero parece funcionar en Webkit. Te dejaré probar IE. : O)

pruébelo:http://jsfiddle.net/ScKbk/

Después de hacer clic para iniciar el intervalo, cambiar el foco de la ventana del navegador para ver el cambio resultado. Una vez más, probado solo en Webkit.

var window_focus; 

$(window).focus(function() { 
    window_focus = true; 
}).blur(function() { 
    window_focus = false; 
}); 

$(document).one('click', function() { 
    setInterval(function() { 
     $('body').append('has focus? ' + window_focus + '<br>'); 
    }, 1000); 
});​ 
+0

@jball - ¿Debe ser IE? En Webkit y Firefox, cualquier activación de la ventana desencadena el foco. Me pregunto si hay una solución para IE. Además, ¿has probado en tu página? ¿Tal vez hay un problema porque el jsFiddle usa marcos? – user113716

+0

Además, presionar la tecla de tabulación parece romperla de forma permanente. – jball

+0

Chrome en realidad. Después de más pruebas, mi primer comentario podría ser incorrecto: la tecla de tabulación que lo rompe parece ser más consistente. – jball

155

utilice el método hasFocus del documento. puede encontrar la descripción detallada y un ejemplo aquí: hasFocus method

EDIT: Agregado violín http://jsfiddle.net/Msjyv/3/

HTML

Currently <b id="status">without</b> focus... 

JS

function check() 
{ 
    if(document.hasFocus() == lastFocusStatus) return; 

    lastFocusStatus = !lastFocusStatus; 
    statusEl.innerText = lastFocusStatus ? 'with' : 'without'; 
} 

window.statusEl = document.getElementById('status'); 
window.lastFocusStatus = document.hasFocus(); 

check(); 
setInterval(check, 200); 
+3

Probé el ejemplo del enlace de arriba y funcionó bien en IE7 +, Chrome y FF4. +1 para ti. –

+1

Gran pequeña función, funciona mucho mejor que otros jQuery equivalentes que he encontrado. – Heath

+3

Más útil que la respuesta aceptada, tuve problemas con la carga del temporizador mientras la ventana estaba desenfocada. – Kokos

1

HTML:

<button id="clear">clear log</button> 
<div id="event"></div>​ 

Javascript:

$(function(){ 

    $hasFocus = false; 

    $('#clear').bind('click', function() { $('#event').empty(); }); 

    $(window) 
     .bind('focus', function(ev){ 
      $hasFocus = true; 
      $('#event').append('<div>'+(new Date()).getTime()+' focus</div>'); 
     }) 
     .bind('blur', function(ev){ 
      $hasFocus = false; 
      $('#event').append('<div>'+(new Date()).getTime()+' blur</div>'); 
     }) 
     .trigger('focus'); 

    setInterval(function() { 
     $('#event').append('<div>'+(new Date()).getTime()+' has focus '+($hasFocus ? 'yes' : 'no')+'</div>'); 
    }, 1000); 
});​ 

test

ACTUALIZACIÓN:

lo arreglaré, pero IE no funciona muy bien

test update

+0

No funciona sistemáticamente en IE8 en mis pruebas. –

+0

Parece que el desenfoque no se dispara cuando se cambian las pestañas. :( –

Cuestiones relacionadas