環境
- Windows 10 Pro 22H2
- Oracle VM VirtualBox 7.0.4 (2022/11/18)
- Debian 11: 11.5 (2022/09/10)
- TypeScript 4.9.3
div要素でkeydownイベントを受け取る
GitHubのリポジトリ
https://github.com/yvafdevnsk/typescript/tree/main/div-keydown
ファイルの一覧
div-keydown |- div-keydown.html |- div-keydown.css |- div-keydown.ts |- div-keydown.js (tsファイルから生成される) |- tsconfig.json
目標
- div要素でkeydownイベントを受け取れるようにする。
要点
- tabindex
- A negative value (usually tabindex="-1") means that the element is not reachable via sequential keyboard navigation, but could be focused with JavaScript or visually by clicking with the mouse. It's mostly useful to create accessible widgets with JavaScript.
- Chromeではdiv要素でkeydownイベントを受け取ると輪郭線(outline)が表示される。
実装1: div要素の定義
div要素をtabindex=-1とすることでJavaScriptまたはマウスクリックでフォーカスを設定できる。キーボードのtabキーによるフォーカス移動の対象にはならない。
<div id="div-keydown" tabindex="-1"></div>
実装2: イベントリスナーの登録
const keydownDiv: HTMLElement | null = document.getElementById("div-keydown"); if (keydownDiv !== null) { keydownDiv.addEventListener("keydown", keydownDivKeydownEventListener); keydownDiv.addEventListener("focusin", keydownDivFocusInEventListener); keydownDiv.addEventListener("focusout", keydownDivFocusOutEventListener); }
実装3: div要素にフォーカスを設定
マウスクリックでフォーカスを設定できる。
JavaScriptでフォーカスを設定する。
const keydownDiv: HTMLElement | null = document.getElementById("div-keydown"); // setTimeout()しないとfocusin > focusout > focusinと3回イベントが発生する。 setTimeout(() => { keydownDiv?.focus(); }, 0);
実装4: focusinイベントの処理
function keydownDivFocusInEventListener(e: FocusEvent): void { console.log("keydownDivFocusInEventListener e", e); }
実装5: focusoutイベントの処理
function keydownDivFocusOutEventListener(e: FocusEvent): void { console.log("keydownDivFocusOutEventListener e", e); }
実装6: keydownイベントの処理
function keydownDivKeydownEventListener(e: KeyboardEvent): void { console.log("keydownDivKeydownEventListener e", e); }
ビルドする
$ npx tsc --target es2015 div-keydown.ts
確認する
F12キーでブラウザの開発者ウインドウを表示してコンソールのログを確認する。