キーボードフォーカスをDIVに与え、キーボードイベントハンドラーをそれにアタッチするにはどうすればよいですか?


83

DIVで表される長方形をクリックし、キーボードを使用してキーボードイベントを一覧表示することにより、そのDIVを移動できるようにするアプリケーションを構築しています。

ドキュメントレベルでこれらのキーボードイベントにイベントリスナーを使用するのではなく、おそらくキーボードフォーカスを与えることによって、DIVレベルでキーボードイベントをリッスンできますか?

問題を説明するための簡略化されたサンプルを次に示します。

<html>
<head>
</head>
<body>

<div id="outer" style="background-color:#eeeeee;padding:10px">
outer

   <div id="inner" style="background-color:#bbbbbb;width:50%;margin:10px;padding:10px;">
   want to be able to focus this element and pick up keypresses
   </div>
</div>

<script language="Javascript">

function onClick()
{
    document.getElementById('inner').innerHTML="clicked";
    document.getElementById('inner').focus();

}

//this handler is never called
function onKeypressDiv()
{
    document.getElementById('inner').innerHTML="keypress on div";
}

function onKeypressDoc()
{
    document.getElementById('inner').innerHTML="keypress on doc";
}

//install event handlers
document.getElementById('inner').addEventListener("click", onClick, false);
document.getElementById('inner').addEventListener("keypress", onKeypressDiv, false);
document.addEventListener("keypress", onKeypressDoc, false);

</script>

</body>
</html>

内側のDIVをクリックすると、フォーカスを合わせようとしますが、後続のキーボードイベントは、DIVレベルのイベントリスナーではなく、常にドキュメントレベルで取得されます。

キーボードフォーカスのアプリケーション固有の概念を実装する必要があるだけですか?

Firefoxで動作するためにこれだけが必要だと付け加えるべきです。



1
実際には重複ではありません-それは約2年前に尋ねました、そしてこれはfocus()関数を使用するのではなく、任意の要素でキーボードイベントを受け取る方法を尋ねています。
ポールディクソン

回答:


165

並べ替え-ターゲットDIVにtabindex属性を追加しました。これにより、たとえばキーボードイベントが取得されます。

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

http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-TECHS/SCR29.htmlから収集した情報


6
また、フォーカスされたときにdivに青い点線の境界線を付けたくない場合は、スタイルを設定できますoutline: 0px solid tranparent;。参照:stackoverflow.com/a/2260788/402807
AlcubierreDrive 2013

4
またはtabindex="-1"、を設定すると、点線の境界線が表示されなくなります。
troglobit 2016

Chrome60とFF54では、これをまったく機能させることができません。IE11は、がなくても魔法のように正しいことを行いtabindexます。この答えは時代遅れですか?
jlh 2017

これは現在のFirefoxでは機能しません。ブラウザはキーボード入力を処理します。フィドルについても同じです。
kwebble 2017年

1
を取り除くことoutlineはアクセスできません。見た目が気に入らない場合は、要素がフォーカスされていることを視覚的に示すことをお勧めします。outline
sleeparrow18年

5

Paulの答えは問題なく機能しますが、次のようにcontentEditableを使用することもできます...

document.getElementById('inner').contentEditable=true;
document.getElementById('inner').focus();

場合によっては好ましいかもしれません。


6
これを行うと、Chrome 17はフォーカスのある要素にカーソルを置き、要素に何かを入力できます。私はこれをお勧めしません。
セッポErviälä

1
@Seppo、それは良い点です。キーボードイベントを使用している場合、必ずしも編集できるとは限りませんが、何をしようとしているのかによっては、カーソルが煩雑になる可能性があります。ちなみに、Chrome 17だけでなく、このように動作する最近のほとんどすべてのブラウザ(確かにFFとSafari)もIEだと思いますが、最近はテストしていません
Peter Bagnall 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.