2010-08-13 69 views
74

如何测试浏览器是否有焦点?JavaScript/jQuery:测试窗口是否有焦点

+0

另请参阅http://stackoverflow.com/questions/483741/how-to-determine-which-html-page-element-has-focus它也可以回答这个问题。 – 2011-06-29 15:12:23

+15

尝试'document.hasFocus()',它返回一个布尔值。 它被构建到规范中,所以它可以在没有jQuery的情况下完成。 – 2013-02-04 21:41:42

回答

74

我没有在其他浏览器中测试过,但它似乎在Webkit中工作。我会让你试试IE。 :O)

试试看:http://jsfiddle.net/ScKbk/

后,您即可启动间隔,改变浏览器窗口的焦点,看结果的变化。再次,仅在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 - 必须是IE?在Webkit和Firefox中,窗口的任何激活都会触发焦点。我想知道是否有一个IE的解决方法。另外,你在你的网页上测试过吗?也许有问题,因为jsFiddle使用框架? – user113716 2010-08-13 19:39:32

+0

此外,按Tab键似乎永久打破它。实际上Chrome实际上是 – jball 2010-08-13 19:39:44

+0

。经过进一步测试,我的第一个评论可能是错误的 - 突破它的标签键似乎更一致。 – jball 2010-08-13 19:40:59

155

使用文件的hasFocus方法。 你可以找到详细的说明和这里的例子: hasFocus method

编辑:新增小提琴 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

我尝试了上述链接的示例,它在IE7 +,Chrome和FF4中运行良好。为你+1。 – 2011-05-03 14:56:57

+1

很棒的小功能,比我碰到的其他jQuery等价物的效果要好得多。 – Heath 2011-08-31 20:10:24

+3

比接受的答案更有用,当窗口没有对焦时,我遇到了加载计时器的问题。 – Kokos 2011-10-17 14:06:28

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

UPDATE:

我会解决它,但IE浏览器不能很好地工作

test update

+0

在我的测试中不一致地在IE8中工作。 – 2010-08-27 15:22:57

+0

切换标签时,显然模糊不会触发。 :( – 2013-11-12 20:41:58