¿Cómo se prueba si el navegador tiene el foco?
javascript
jquery
events
varilla
fuente
fuente
document.hasFocus()
, que devuelve un booleano. Está integrado en la especificación, por lo que se puede hacer sin jQuery.Respuestas:
No lo he probado 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, cambie el enfoque de la ventana del navegador para ver el cambio de resultado. Nuevamente, 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); });
fuente
window
objeto, por lo que si usara cuadros, probablemente solo necesitaría incluir el script en cada uno.window.top
para comprobar la ventana superior.utilice el método hasFocus del documento. Puede encontrar una descripción detallada y un ejemplo aquí: método hasFocus
EDITAR: violín agregado 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);
fuente
if(typeof document.hasFocus === 'undefined') { document.hasFocus = function () { return document.visibilityState == 'visible'; } }
Fragmento de JavaScript simple
Basado en eventos:
function focuschange(fclass) { var elems=['textOut','textFocus']; for (var i=0;i<elems.length;i++) { document.getElementById(elems[i]). setAttribute('class',fclass); } } window.addEventListener("blur",function(){focuschange('havnt')}); window.addEventListener("focus",function(){focuschange('have')}); focuschange('havnt');
.have { background:#CFC; } #textOut.have:after { content:''; } .havnt { background:#FCC; } #textOut.havnt:after { content:' not'; }
<span id='textOut'>Have</span><span id='textFocus'> focus</span>
Grupo de intervalos basado:
setInterval(function() { var fclass='havnt'; if (document.hasFocus()) { fclass='have'; }; var elems=['textOut','textFocus']; for (var i=0;i<elems.length;i++) { document.getElementById(elems[i]). setAttribute('class',fclass); } },100);
#textOut.have:after { content:''; } #textOut.havnt:after { content:' not'; } .have { background:#CFC; } .havnt { background:#FCC; }
<span id='textOut'>Have</span><span id='textFocus'> focus</span>
fuente
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); });
prueba
ACTUALIZAR:
Lo arreglaré, pero IE no funciona muy bien
actualización de prueba
fuente