$ .focus()が機能しない


155

jQueryのの最後の例focus()ドキュメントの状態

$('#id').focus()

入力をフォーカス(アクティブ)する必要があります。私はこれを動作させるようには思えません。

このサイトのコンソールでも、検索ボックスで試しています

$('input[name="q"]').focus()

そして、私は何も得ていません。何か案は?


2
コードを見せていただけますか?
Adil 2013

:それは私のために罰金を動作しますので、我々は、より多く知っている必要がありますjsfiddle.net/G7hwR/1はちょうど右のパネルで任意の場所をクリックすると、それは...焦点を当てて
ロブGを

しかし、このページに焦点を当てるべきではありませんか?私が提供したスニペット?
Sam Selikoff 2013

それは何に含​​まれるかによります。内部にない場合は、ページがレンダリングされる前に実行されている可能性があります...
Rob G

検索からここに来る人のために:ブラウザーの組み込み開発者ツールは、focus()機能に干渉する可能性があります。詳細
aexl 2017年

回答:


392

実際、あなたがこのサイトに集中するために挙げた例は、コンソールに集中していなければ問題なく機能します。機能しない理由は、単に開発コンソールからフォーカスを奪っていないためです。コンソールで次のコードを実行し、その後すぐにブラウザーウィンドウをクリックすると、検索ボックスがフォーカスされていることがわかります。

setTimeout(function() { $('input[name="q"]').focus() }, 3000);

もう一つは、過去に困ったことの一つがイベントの順番です。DOMにアタッチされていない要素に対してfocus()を呼び出すことはできません。フォーカスしようとしている要素はすでにDOMにアタッチされていますか?


1
すごい!それはあなたの両方の問題を解決しましたか?もしそうなら、あなたはそれを正しい答えとしてマークできますか?よろしくお願いします:D
Justin Warkentin 2013

4
。仕事やない;だけで$(「入力[名前= 『q』を]」)を使用したときにフォーカス()開発ツールを使用していない
阿弥陀

12
うわー、私は何ヶ月もこれに取り組んでいましたが、これは開発者コンソールが開いていることが原因であることがわかりました。私はいつもそうです。ありがとうございました!
Alex Turpin 2013年

20
+1「DOMにアタッチされていない要素に対してfocus()を呼び出すことはできません。」また、非表示の要素では呼び出すことができないようです。
tandrewnichols 2015

1
setTimeout操作順序の問題を解決するためにを使用すると、維持するのが非常に困難になります。バグが見つかった場合、デバッグは非常に困難です。要素をDOMに挿入する場所はどこでも、そこから呼び出す必要が.focus()あります。
Kevin Beal

55

ネット上の他の場所で解決策を見つけました...

$('#id').focus();

動作しませんでした。

$('#id').get(0).focus();

働いた。


4
このページでより人気のあるソリューションがうまくいかなかったのに、私がうまくいったという理由だけで、このソリューションを賛成しました。;-)
chriv

2番目のオプションは、dom要素を取得し、jqueryバージョンの代わりに通常のJavaScriptバージョンを使用しているようです。
danielson317

7
あなたのページにID「id」を持つ複数の要素があるのでしょうか?この場合、DOMは機能しませんが、複数の要素にフォーカスを割り当てることもできません
DerpyNerd

私はwindow.setTimeoutを0の遅延で使用してこれを行う必要があることを発見しました。ありがとう。私が試した他のすべては、ブートストラップモーダルで失敗しました。
ウェイドハトラー

23

ここでの回答のいくつかは、を使用setTimeoutしてターゲット要素に焦点を合わせるプロセスを遅らせることを提案しています。それらの1つは、ターゲットがモーダルダイアログ内にあると述べています。setTimeoutソリューションが使用された場所の具体的な詳細を知らない限り、ソリューションの正確性についてさらにコメントすることはできません。しかし、私がここで答えを出して、私と同じようにこのスレッドに遭遇した人々を助ける必要があると考えました

問題の簡単な事実は、まだ表示されていない要素に焦点を合わせることができないということです。この問題が発生した場合は、ターゲットに焦点を合わせようとしたときに、ターゲットが実際に表示されていることを確認してください。私自身の場合、私はこれらの線に沿って何かをしていました

$('#elementid').animate({left:0,duration:'slow'});
$('#elementid').focus();

これは機能しませんでした。私はコンソールから$( '#elementid')。focus() `を実行したときに何が起こっているのかを理解しましたやった仕事を。違いは、ターゲットの上の私のコードでは、アニメーションが完了していない可能性があるため、ターゲットが実際に表示されるかどうかは確実ではありません。そして、手がかりがあります

$('#elementid').animate({left:0,duration:'slow',complete:focusFunction});

function focusFunction(){$('#elementid').focus();}

期待どおりに動作します。私も最初はsetTimeout解決策、それもうまく。ただし、任意に選択したタイムアウトは、ホスト要素がターゲット要素が表示されることを確認するプロセスの進行速度に応じて、遅かれ早かれソリューションを中断するようにバインドされています。


私に関連するヒントは、「ターゲットが実際に表示されていることを確認する」でした。これは、条件付きでレンダリングされた要素に焦点を当てようとするときに関連します。
チャーリーカーバー2017年

または、フォーカスする要素がある場合visibility:hidden- フォーカスされません。
バクラル

「まだ表示されていない要素に集中することはできません」-愛しています。100msのタイムアウトを追加するだけで、非表示の検索ボックスにフォーカスをトリガーできます。ありがとう!
LuBre

タイムアウトに注意してください。開発マシンで機能するものは、別のマシンでは機能しない場合があります。
DroidOS

15

ブートストラップ+モーダルを使用する場合、これは私にとってはうまくいきました:

  $(myModal).modal('toggle');
  $(myModal).on('shown.bs.modal', function() {
    $('#modalSearchBox').focus()
  });

8

他の誰かがこの質問に遭遇し、同じ状況にあった場合に備えて-別の要素をクリックした後にフォーカスを設定しようとしましたが、フォーカスが機能していないように見えました。それは私がちょうど必要だったことがわかりましたe.preventDefault();-ここに例があります:

$('#recipients ul li').mousedown(function(e) {
    // add recipient to list
    ...
    // focus back onto the input
    $('#message_recipient_input').focus();
    // prevent the focus from leaving
    e.preventDefault();
});

これは役立ちました:

mousedownイベントハンドラーからHTMLElement.focus()を呼び出す場合は、event.preventDefault()を呼び出して、フォーカスがHTMLElementから離れないようにする必要があります。ソース:https : //developer.mozilla.org/en/docs/Web/API/HTMLElement/focus


2
唯一の作品!トリガーはポップアップdivです。クリックするとdivが非表示になり、テキストボックスに値を入力します(フォーカスする必要はありません)。preventDefaultがない場合、そのテキストボックスは、何があっても常にフォーカスされます
-__-

4

これは古いことに気づきましたが、今日出会いました。答えはどれもうまくいきませんでした。うまくいったとわかったのはsetTimeoutです。setTimeoutを使用して、モーダルの入力フィールドに焦点を当てたいと思いました。お役に立てれば!


私も!そして、タイムアウトの長さが本当に違いを生みました。愚かなIE。
eaglei22 2017

1
ただし、モバイルデバイスでは機能しません。モバイルブラウザーは、ほとんどの場合、setTimeoutの内容をすべて無視しています
Kosmonaft

1
経験則として、使用setTimeout悪い解決策です。ユーザーのマシンでの実行時間は保証できないため、時間に依存するものは非常に脆弱です。
ネイサン

3

私もこの問題を抱えていました。私の場合に機能した解決策は、HTML要素のtabindexプロパティを使用することでした。

使っていた ng-repeatリスト内のいくつかのli要素していて、.focus()を使用して最初のliにフォーカスを移すことができなかったため、ループ中にtabindex属性を各liに単に追加しました。

だから今 <li ng-repeat="user in users track by $index" tabindex="{{$index+1}}"></li>

その+1は0から始まるインデックスです。また、.focus()関数を呼び出す前に、要素がDOMに存在することを確認してください

これがお役に立てば幸いです。


2

"$(element).show()"を使用したために機能しないという問題がある人のために。私はそれを次の方法で解決しました:

 var textbox = $("#otherOption");
 textbox.show("fast", function () {
    textbox[0].focus();
  });

したがって、タイマーは必要ありません。showメソッドの完了後に実行されます。


これは、他の遷移に適用されますslideDown()fadeIn()など
アルバロ・ゴンサレス

2

focus()の前に遅延を追加します。200ミリ秒で十分です

function focusAndCursor(selector){
  var input = $(selector);
  setTimeout(function() {
    // this focus on last character if input isn't empty
    tmp = input.val(); input.focus().val("").blur().focus().val(tmp);
  }, 200);
}

0

この問題が今も発生していて、信じられないかもしれませんが、私がしなければならないことは、開発者ツールを閉じることだけでした。どうやら[コンソール]タブは、ページコンテンツよりもフォーカスの優先度が高いようです。


0

要素とその親が表示されていることを確認してください。非表示の要素にフォーカスを使用することはできません



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