キーコード情報

キーを押すだけで KeyboardEvent のすべてのプロパティを確認できます。key、code、keyCode、which、location、および ctrl・shift・alt・meta フラグとコピー可能な JSON を表示します。

キーを押して、ブラウザが実際に何を報告しているかを確認しましょう。 下のキャプチャ領域をクリックし、任意のキーまたは組み合わせを押してください。KeyboardEvent の各プロパティが横並びで表示されるため、ショートカット処理で推測せずに適切なプロパティを選べます。

event.key
event.code
event.keyCode
event.which
event.location
押されている修飾キー
なし

key と code と keyCode は同じものではない

3 つのプロパティ、3 つの異なる問い

KeyboardEvent はキーを識別する方法をいくつも公開していますが、それぞれが答えている問いは本当に異なります。event.key は、キーボードレイアウトと修飾キーが適用された後にキー押下が生み出す文字または名前付きの値です。物理的な A キーを押すと a、Shift を押しながらなら A、Dvorak や AZERTY のレイアウトではまったく別の文字になります。名前付きのキーは EnterEscapeArrowLeftF5 といった説明的な文字列として届きます。

一方 event.code は物理的なキー位置を識別し、仮想的な US キーボードに由来するレイアウト非依存の名前を使います。A の位置にあるキーはユーザーのレイアウトが何を出力しようと常に KeyA です。最上段の数字は Digit1 から Digit0、テンキーは Numpad1 などを報告するため、2 列の数字を区別できます。

event.keyCode とその双子である event.which はレガシーな数値識別子です。どちらも仕様上は非推奨ですが、いまだにすべてのブラウザで実装されており、記号類についてはブラウザ間で値が一致しません。古いコードを保守する際には読む価値がありますが、新しいショートカット処理では keycode を使うべきです。

key と code のどちらを選ぶか

目安は単純です。位置が重要なら code、意味が重要なら key を使います。移動を WASD に割り当てるゲームは code を使うべきです。プレイヤーの左手の下にある物理的なキーの塊は、AZERTY キーボードで ZQSD を出力するとしても同じ位置にあるべきだからです。保存を Ctrl+S に割り当てるテキストエディタは key を使うべきです。ユーザーが考えているのは A の隣のキーではなく文字 S だからです。

修飾キーは独立した真偽値です:ctrlKeyshiftKeyaltKeymetaKeykey から推測せず明示的に判定し、主要なショートカット修飾キーが macOS では Command、それ以外では Control であることを覚えておいてください。よくある書き方は event.metaKey || event.ctrlKey を受け入れ、1 つのハンドラで両プラットフォームをカバーする方法です。

event.location は重複するキーを区別します。標準キーは 0、左 Shift のような対になるキーの左側は 1、右側は 2、テンキー上のキーは 3 です。

実務上の落とし穴

すべてのキーが期待どおりのイベントを生成するわけではありません。ブラウザは一部の組み合わせを自分用に予約しています。Ctrl+W、Ctrl+T、Command+Q は通常、ページが見る前にタブを閉じたりアプリを終了したりし、preventDefault でも取り戻せません。ショートカットはハンドラに届くと決めつけず、実際のブラウザウィンドウで必ず試してください。

キーを押し続けると最初のイベントの後に event.repeat が true のリピートイベントが連続して発生します。一度だけ発火させたいショートカットではリピートを無視し、スクロールやカーソル移動のように連続的な動作では受け入れてください。

最後に、keydownkeyup はキーを、削除された keypress は文字を表していました。テキスト入力では input イベントを購読するか beforeinput を読む方が望ましく、IME の変換、オートコンプリート、モバイルキーボードをキーレベルのイベントよりはるかに確実に扱えます。

オープンソースに関する注記:バニラ JavaScript で実装。サードパーティライブラリは使用していません。

よくある質問

ショートカットには key と code のどちらを使うべきですか?
ゲームの WASD 移動のように物理的な位置が重要な場合は `code` を、保存の Ctrl+S のように意味が重要な場合は `key` を使ってください。後者ならユーザー自身のレイアウトに追随します。
keyCode は非推奨なのになぜ動くのですか?
レイアウトを考慮したイベントより前から存在し、記号についてはブラウザごとに異なる数値を返します。互換性のためすべてのエンジンが実装し続けていますが、仕様は新しいコードに `key` と `code` を推奨しています。
Ctrl+W や Command+Q を押しても何も起きません。
これらの組み合わせはブラウザや OS が確保しており、ページが受け取る前に処理されます。通常の Web ページから確実に横取りする方法はありません。
macOS と Windows の両方で動くショートカットはどう書きますか?
`event.metaKey || event.ctrlKey` でどちらの主修飾キーも受け入れてください。ユーザーエージェントで分岐せずに macOS の Command と Windows・Linux の Control に対応できます。
location が 3 なのはどういう意味ですか?
そのキーがテンキー上にあることを意味します。1 と 2 は Shift や Control のような対になるキーの左右を、0 は重複のない通常のキーを表します。
これをテキスト入力の処理に使えますか?
`input` イベントを購読する方が適切です。キーイベントは IME の変換、オートコンプリート、多くのモバイル仮想キーボードを取りこぼしますが、`input` はそれらを正しく報告します。