jQueryでフォーカスされた要素を取得するにはどうすればよいですか?


345

jQueryを使用して、キャレット(カーソル)にフォーカスがある入力要素を取得するにはどうすればよいですか?

または、言い換えると、入力にキャレットのフォーカスがあるかどうかをどのように判断するのですか?



回答:


740
// Get the focused element:
var $focused = $(':focus');

// No jQuery:
var focused = document.activeElement;

// Does the element have focus:
var hasFocus = $('foo').is(':focus');

// No jQuery:
elem === elem.ownerDocument.activeElement;

あなたはどちらを使うべきですか?jQueryドキュメントを引用する:

他の疑似クラスセレクター( ":"で始まるもの)と同様に、:focusの前にタグ名またはその他のセレクターを置くことをお勧めします。それ以外の場合は、ユニバーサルセレクター( "*")が暗黙指定されます。つまり、bareはと$(':focus')同等$('*:focus')です。現在フォーカスされている要素を探している場合、$(document.activeElement)は、DOMツリー全体を検索する必要なく要素を取得します。

答えは:

document.activeElement

要素をラップするjQueryオブジェクトが必要な場合:

$(document.activeElement)

2
しかし、待って、どのようにしてキャレットを持つ要素を取得しますか?
daveは

@デイブ。「キャレットを持っている」とはどういう意味ですか?焦点を当てた?マウスがその上にありますか?
gdoronはモニカをサポートしています

これが私の状況です。特定の要素をクリックしたときに、最後にフォーカスされた入力テキスト要素に文字を配置したいのです。基本的に、特定の要素をクリックする前に最後または右にフォーカスがあった要素。
daveは

1
@デイブ。それはできません。IEだけがこの機能を備えていると思いますが、今は別の質問をしているので、新しい質問でそれを行う必要があります。
gdoronはモニカサポートされて

3
変数$focusedがjqueryオブジェクトであることを示すためにそれを行うと想定しているため、$プレフィックス付き変数名を使用した方法が好きです。TYVM。
Valamas 2013


6

Firefox、Chrome、IE9、Safariの2つの方法でテストしました。

(1)。$(document.activeElement)Firefox、Chrome、Safariで期待どおりに動作します。

(2)。$(':focus')FirefoxおよびSafariで期待どおりに動作します。

マウスに移動して「名前」を入力し、キーボードのEnterキーを押してから、フォーカスされている要素を取得しようとしました。

(1)。$(document.activeElement)Firefox、Chrome、Safariでは期待どおりにinput:text:nameを返しますが、IE9ではinput:submit:addPasswordを返します

(2)。$(':focus')FirefoxおよびSafariでは期待どおりにinput:text:nameを返しますが、IEでは何も返しません。

<form action="">
    <div id="block-1" class="border">
        <h4>block-1</h4>
        <input type="text" value="enter name here" name="name"/>            
        <input type="button" value="Add name" name="addName"/>
    </div>
    <div id="block-2" class="border">
        <h4>block-2</h4>
        <input type="text" value="enter password here" name="password"/>            
        <input type="submit" value="Add password" name="addPassword"/>
    </div>
</form>

5

これを試して:

$(":focus").each(function() {
    alert("Focused Elem_id = "+ this.id );
});

はい、そのため、このループの反復は1つだけです。アラートは例を示すためのものです。この変数があれば、必要な要素ですべてを行うことができます。
Adil Malik

どのようにして複数の要素に焦点を合わせることが可能ですか?
Andreas Furster 2014

@AndreasFursterあなたは正しい。このループには常に1つの反復しかありません。これは目標を達成するための最良の方法ではないかもしれませんが、機能します。
Adil Malik

これがなぜ最悪の/最も効率の悪い方法であるのかについては、認められた回答を参照してください。(不必要な.each非存続)
Brad Kent

2

誰も言及していません。

document.activeElement.id

IE8を使用していますが、他のブラウザでテストしていません。私の場合は、フィールドが4文字以上で、演技前に焦点が合っていることを確認するために使用しています。4番目の番号を入力すると、トリガーされます。フィールドのIDは「年」です。使っています..

if( $('#year').val().length >= 4 && document.activeElement.id == "year" ) {
    // action here
}

1

$(':focus')[0] 実際の要素を提供します。

$(':focus') 要素の配列が得られます。通常、一度に1つの要素のみがフォーカスされるため、複数の要素にフォーカスがある場合にのみ、これがより効果的です。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.