JavaScriptのfocus()関数を使用して<div>にフォーカスすることは可能ですか?


227

<div>JavaScript focus()関数の使用に集中することは可能ですか?

私が持っている<div>タグを

<div id="tries">You have 3 tries left</div>

私は<div>使用して上記に焦点を当てようとしています:

document.getElementById('tries').focus();

しかし、それは機能しません。誰かが何かを提案できますか....?


3
「集中」するとどうなりますか?divは入力を受け入れないので、境界線をフラッシュしますか、それとも背景のハイライトをフラッシュしますか?
Michael Shimmins、2010

@マイケル、はい、ユーザーの注意を引くために<div>が必要です...
OM The Eternity


1
@MichaelShimminsと他の誰でも、contenteditableをtrueに設定すると、<div>要素は入力を受け入れることができます。(私が尋ねた理由)
MattOlivos 2017

1
@MichaelShimminsはdiv、オーバーフローしてスクロールバーが表示された場合に入力を受け入れることができます。ときdivと、スクロールバーがフォーカスされ、矢印キーは、(代わりのような他の要素の内容、その内容をスクロールしますbody)。
ロリー・オケイン

回答:


101
window.location.hash = '#tries';

これは問題の要素にスクロールし、本質的にそれを「フォーカス」します。


2
@Casey Chu:つまり、Firefoxではうまくいきませんが、何かアイデアはありますか?
Haseeb Akhtar 2014

一部のChromeバージョンでは動作しません...しかし、@ vinothsソリューションは動作します
Charliemops

1
これは機能しますが、Angularでは問題が発生します。
Carlos Verdes、2015

@CarlosVerdes; Angularの解決策はありますか?
Mac Vicious

3
「焦点」の質問に答えないでください、これは正しい答えではありません。私の場合、 'contentEditable' divに焦点を当てたいのですが、あなたのトリックは役に立ちません。
アルナウダンブロ

453

はい-これは可能です。それを行うには、tabindexを割り当てる必要があります...

<div tabindex="0">Hello World</div>

tabindexが0の場合、タグは「ページの通常のタブ順」に配置されます。数値が大きいほど優先順位が高くなります。1が最初、2秒が順に続きます。

tabindexに-1を指定することもできます。これにより、divはユーザーではなくスクリプトでのみフォーカス可能になります。

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>

明らかに、スクリプトでフォーカスできる要素があるのは残念です。他の入力メソッドではフォーカスできない要素です(特に、ユーザーがキーボードのみまたは同様に制約されている場合)。また、デフォルトでフォーカス可能であり、ユーザーを支援するためにセマンティック情報組み込まれた標準的な要素もたくさんあります。この知識を賢く使ってください。


6
@Michael Shimmins、これにより、要素を(非標準的な方法で)フォーカス可能にすることができますfocus()
ストレッジャー2010

2
@オリカル-私はそれが答えの最後の行でそれが言っていることと全く同じだと確信しています。編集が必要な問題があると思われる場合はお知らせください。
フェントン2013年

2
それは明確ではなかった場合は、追加tabindex要素にすることは可能にする、それがフォーカス可能になりますfocus()blur()方法を、その後、あなたはこのようなフォーカストリガすることができます:document.getElementById('tries').focus();
pilau

4
こんにちは@SteveOwen-Firefox v42でも動作するようです。この回答にスニペットを追加したので、実行してテストできます。
Fenton

9
@SteveOwenを使用するのwindow.location.hash = ...がその方法です。フォーカスは、「表示する」ことを意味するのではなく、文字通りその要素にフォーカスを置くことを意味します。
Fenton、

76

document.getElementById('tries').scrollIntoView()動作します。これはwindow.location.hash 、位置を固定した場合よりもうまく機能します。


2
このソリューションはIE、Opera、Safariでは機能しないことに注意してください。
AlecRust 2017

1
Chrome 65で試したところ、うまくいきません。オーバーレイdivがスクロールして表示されますが、フォーカスはまだ背景divにあります。私が知っている唯一確実な方法tabindexは、オーバーレイdivにタブ属性要素(属性を使用)を置き、focus()代わりにその要素で使用することです。
thdoan

@ om-the-eternityは、divがユーザーの注意を喚起することを望んでいるとすでに述べているので、必要なのはdivを実際にフォーカスするのではなく(それを行うには正しくない)、divを画面に表示することです、これで解決します
Omar Vazquez 2018

Chromeでこれを行うと、まだフォーカスされている入力フィールドまでスクロールし続けます。特に、ページの読み込みがまだ完了していない場合。
Roger Krueger

37

あなたはtabindexを使うことができます

<div tabindex="-1"  id="tries"></div>

tabindex値は、興味深い動作を可能にします。

  • 「-1」の値を指定した場合、要素にタブを付けることはできませんが、プログラムによって(element.focus()を使用して)要素にフォーカスを与えることができます。
  • 値が0の場合、要素はキーボードを介してフォーカスされ、ドキュメントのタブフローに分類されます。0より大きい値は優先度レベルを作成し、1が最も重要です。

1
うわー、クールなトリックに感謝します。ありがとうございました!そうでなければ、私はこれを理解しなかったでしょう。
AVProgrammer 2018

ライフセーバー、ありがとう。Edgeではdivに焦点を合わせることができますが、このトリックがないとChromeではできません。受け入れられた答えは素晴らしいですが、URLに追加の部分は必要ありません。
カル

命を救う。ChromeとFirefoxでうまく機能する
Susampath

14
<div id="inner" tabindex="0">
    this div can now have focus and receive keyboard events
</div>

これは、Chromium / Chrome 46との組み合わせでのみ機能します$('#inner').focus();
TNT

2

Michael Shimminのようなものを提案したかったのですが、要素やそれに適用されるCSSなどのハードコーディングはしていません。

私は追加/削除クラスにjQueryを使用していますが、jqueryを使用したくない場合は、追加/削除クラスの代わりが必要です

--Javascript

function highlight(el, durationMs) { 
  el = $(el);
  el.addClass('highlighted');
  setTimeout(function() {
    el.removeClass('highlighted')
  }, durationMs || 1000);
}

highlight(document.getElementById('tries'));

--CSS

#tries {
    border: 1px solid gray;
}

#tries.highlighted {
    border: 3px solid red;
}

1

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>


0

ボーダーを点滅させるには、次のようにします。

function focusTries() {
    document.getElementById('tries').style.border = 'solid 1px #ff0000;'
    setTimeout ( clearBorder(), 1000 );
}

function clearBorder() {
    document.getElementById('tries').style.border = '';
}

これにより、ボーダーが1秒間赤くなり、その後再び削除されます。

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