JavaScript / jQuery : 창에 포커스가 있는지 테스트


80

브라우저에 포커스가 있는지 어떻게 테스트합니까?


또한 이 질문에 답할 수있는 stackoverflow.com/questions/483741/… 도 참조하십시오 .
Alexander Bird

15
document.hasFocus()부울을 반환하는 Try . 사양에 내장되어 있으므로 jQuery 없이도 수행 할 수 있습니다.
Braden Best

페이지의 가시성 ( 초점과 동일 하지 않음) 을 확인하려는 사람은 페이지 가시성 API 에서 자세한 내용을 확인하십시오.
tsh

답변:


79

나는 이것을 다른 브라우저에서 테스트하지 않았지만 Webkit에서 작동하는 것 같습니다. IE를 사용해 보겠습니다. :영형)

시도해보세요 : 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);
});​

@jball-IE 여야합니까? Webkit 및 Firefox에서 창을 활성화하면 포커스가 트리거됩니다. IE에 대한 해결 방법이 있는지 궁금합니다. 또한 페이지에서 테스트 했습니까? jsFiddle이 프레임을 사용하기 때문에 문제가 있습니까?
user113716 2010-08-13

실제로 크롬. 추가 테스트 후 첫 번째 의견이 잘못되었을 수 있습니다. 탭 키가 더 일관된 것 같습니다.
jball 2010-08-13

@jball-jsFiddle에는 다른 프레임에 많은 입력 요소가 있기 때문에 탭 키가 끊어진다고 생각합니다. 프레임을 제거하면 조금 더 잘 작동 할 것입니다.
user113716 2010-08-13

각 프레임에는 자체 window개체 가 있다고 생각 하므로 프레임을 사용하려면 각 프레임에 스크립트를 포함해야 할 것입니다.
user113716 2010-08-13

4
window.top최상위 창을 확인하는 데 사용 합니다.
Mårten Wikström 2011-06-17

160

문서의 hasFocus 메서드를 사용합니다. 여기에서 자세한 설명과 예를 찾을 수 있습니다. hasFocus 메서드

편집 : 바이올린 추가 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.
Joseph Lust

1
아주 작은 기능, 내가 만난 다른 jQuery 등가물보다 훨씬 잘 작동합니다.
Heath

3
허용되는 답변보다 더 유용하다는 것은 창에 초점이 맞지 않는 동안 타이머 로딩에 문제가있었습니다.
Kokos

이것은 Opera에서 지원되지 않습니다. 진정 사실은 그들이 렌더링 엔진을 Webkit으로 전환하는 과정에 있다는 것입니다. :)
Nikola Petkanski

6
그 동안 Opera에서 기능을 얻기 위해 다음과 같은 것을 사용할 수 있습니다. if(typeof document.hasFocus === 'undefined') { document.hasFocus = function () { return document.visibilityState == 'visible'; } }
Kent

3

간단한 자바 스크립트 스 니펫

이벤트 기반 :

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>

간격 풀 기반 :

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>


이벤트 기반 솔루션 때문에이 답변이 마음에 듭니다 . 임호, 항상 선호하는 방법이어야한다.

1

HTML :

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

자바 스크립트 :

$(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);
});​

테스트

최신 정보:

수정하겠습니다.하지만 IE는 잘 작동하지 않습니다.

테스트 업데이트


탭을 전환 할 때 블러가 발생하지 않는 것 같습니다. :(
Jethro Larson 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.