JavaScript / jQuery:ウィンドウにフォーカスがあるかどうかをテストします


80

ブラウザにフォーカスがあるかどうかをどのようにテストしますか?


この質問にも答えることができるstackoverflow.com/questions/483741/…も参照してください。
アレクサンダーバード

15
document.hasFocus()ブール値を返す、を試してください。仕様に組み込まれているため、jQueryなしで実行できます。
ブレーデンベスト

ページの可視性(フォーカスと同じではありません)を確認したい場合は、Page VisibilityAPIで詳細を確認してください。
TSH

回答:


79

他のブラウザではテストしていませんが、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);
});​

@ jball-IEである必要がありますか?WebkitとFirefoxでは、ウィンドウをアクティブにするとフォーカスがトリガーされます。IEの回避策があるのだろうか。また、ページでテストしましたか?jsFiddleがフレームを使用しているため、問題があるのではないでしょうか。
user113716 2010

実際にはChrome。さらにテストした後、私の最初のコメントは間違っている可能性があります-それを壊すタブキーはより一貫しているようです。
jball 2010

@ jball-jsFiddleには他のフレームに多くの入力要素があるため、タブキーで壊れていると思います。フレームを取り除いてください、そして私はそれがあなたのためにもう少しうまくいくと思います。
user113716 2010

各フレームには独自のwindowオブジェクトがあると思います。したがって、フレームを使用する場合は、おそらく各フレームにスクリプトを含める必要があります。
user113716 2010

4
window.top一番上のウィンドウを確認するために使用します。
マーテンWikström

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。
ジョセフラスト

1
素晴らしい小さな関数で、私が遭遇した他の同等のjQueryよりもはるかにうまく機能します。
ヒース

3
受け入れられた答えよりも便利でしたが、ウィンドウの焦点が合っていないときにタイマーの読み込みに問題がありました。
ココス2011年

これはOperaではサポートされていません。
心を

6
一方で、あなたはOperaで機能性を得るために、このようないくつかのものを使用することができます if(typeof document.hasFocus === 'undefined') { document.hasFocus = function () { return document.visibilityState == 'visible'; } }
ケント

3

シンプルなJavaScriptスニペット

イベントベース:

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>

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

テスト

更新:

修正しますが、IEがうまく機能しません

テストアップデート


どうやら、タブを切り替えるときにぼかしは発生しません。:(
Jethro Larson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.