How do you test if the browser has focus?
            Asked
            
        
        
            Active
            
        
            Viewed 9.5k times
        
    83
            
            
        - 
                    See also http://stackoverflow.com/questions/483741/how-to-determine-which-html-page-element-has-focus which can answer this question as well. – Alexander Bird Jun 29 '11 at 15:12
- 
                    15Try `document.hasFocus()`, which returns a boolean. It's built into the spec, so it can be done without jQuery. – Braden Best Feb 04 '13 at 21:41
- 
                    For someone who want check pages' visibility (which is _not_ as same as focus), please checkout [Page Visibility API](https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API) for more details. – tsh Apr 19 '18 at 10:08
4 Answers
162
            
            
        use the hasFocus method of the document. You can find detailed description and an example here: hasFocus method
EDIT: Added fiddle 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);
 
    
    
        cvsguimaraes
        
- 12,910
- 9
- 49
- 73
 
    
    
        gumape
        
- 2,832
- 2
- 18
- 9
- 
                    3I tried the example from the above link and it worked well in IE7+, Chrome, and FF4. +1 for you. – Joseph Lust May 03 '11 at 14:56
- 
                    1Great little function, works much better than other jQuery equivalents I have run across. – Heath Aug 31 '11 at 20:10
- 
                    3More useful than the accepted answer, I had problems with the timer loading while the window was out of focus. – Kokos Oct 17 '11 at 14:06
- 
                    This is not supported by Opera. The calming fact is that they are in process of switching the rendering engine to Webkit :) – Nikola Petkanski Feb 25 '13 at 08:38
- 
                    6In the meantime you can use some thing like this to get the functionality in Opera: `if(typeof document.hasFocus === 'undefined') { document.hasFocus = function () { return document.visibilityState == 'visible'; } }` – Kent Apr 02 '13 at 09:37
- 
                    currently `document.hasFocus` always returns true on Mac Chromium, so you should use another approach until the bug is fixed – sNiCKY Apr 14 '13 at 14:11
- 
                    this solution works on IE9, FF 28.0 and Chrome 34.x. Previously I tried with window.onfocus and window.onblur. that worked in FF and Chrome but not in IE. – Farish May 09 '14 at 11:24
- 
                    The solution will now work in all browsers, including the latest Opera since they recently converted their rendering engine to Webkit. – Fizzix May 16 '14 at 00:18
- 
                    @sNiCKY It is `document.hasFocus()` to check the visibility state. `document.hasFocus` returns `true` for the property's existence only. – hexalys Jun 20 '14 at 02:29
- 
                    Does this work on mobile browsers? On some devices, some mobile browser window threads and timers are frozen when not active, no? – Domi Mar 09 '15 at 11:39
- 
                    This answer/question is a lot like http://stackoverflow.com/questions/354718/detect-which-form-input-has-focus-using-javascript-or-jquery The accepted answer is a hack whereas the most upvoted answer contains a much simpler answer from the standards. – Ruan Mendes Apr 29 '15 at 18:13
79
            I haven't tested this in other browsers, but it seems to work in Webkit. I'll let you try IE. :o)
Try it out: http://jsfiddle.net/ScKbk/
After you click to start the interval, change the focus of the browser window to see the result change. Again, tested only in 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);
});
 
    
    
        d-coder
        
- 1,180
- 1
- 11
- 17
 
    
    
        user113716
        
- 318,772
- 63
- 451
- 440
- 
                    @jball - Must be IE? In Webkit and Firefox any activation of the window triggers the focus. I wonder if there's a workaround for IE. Also, did you test on your page? Maybe there an issue because the jsFiddle uses frames? – user113716 Aug 13 '10 at 19:39
- 
                    Chrome actually. After further testing, my first comment might be wrong - the tab key breaking it seems to be more consistent. – jball Aug 13 '10 at 19:40
- 
                    @jball - I'm guessing that the tab key breaks it because jsFiddle has lots of input elements in other frames. Get rid of the frames, and I'll bet it will work a little better for you. – user113716 Aug 13 '10 at 19:42
- 
                    I believe each frame has its own `window` object, so if you were to use frames, you would probably just need to include the script in each one. – user113716 Aug 13 '10 at 19:45
- 
                    4
- 
                    This works when returning to the page from doing something in a popup, cheers! – SSH This May 20 '13 at 16:38
- 
                    Is there a way to check the result on page/tab/window load without using click function ? – query Apr 28 '15 at 22:51
3
            
            
        Simple javascript snippet
Event based:
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>Interval pool based:
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> 
    
    
        F. Hauri  - Give Up GitHub
        
- 64,122
- 17
- 116
- 137
- 
                    I like this answer because of the *event based solution*. Imho, it should be the prefered way always. – quasi Sep 12 '20 at 11:56
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);
});
UPDATE:
I'll fix it, but IE does not work very well
 
    
    
        andres descalzo
        
- 14,887
- 13
- 64
- 115
 
    