【JavaScript】キーボード入力を取得する方法|event.key・event.codeとkeyCode(非推奨)の違い・移行ガイド

フォームのEnter送信やショートカットキーなど、JavaScriptでキーボード入力を判定したい場面は多くあります。かつては event.keyCode が使われていましたが、現在は非推奨です。今は event.keyevent.code を使い分けるのが正解です。

この記事の結論:入力された「文字・キーの意味」で判定するなら event.key(例:"a", "Enter", "Shift")、キーボード上の「物理的な位置」で判定するなら event.code(例:"KeyA", "ShiftLeft")を使います。event.keyCode非推奨なので新規実装では使いません。
スポンサーリンク

event.keyCode は非推奨

event.keyCode は押されたキーを数値で返すプロパティでした(Enterなら13など)。しかしキーボードレイアウトやIMEで値が安定せず、仕様上も非推奨(deprecated)です。読みづらく将来削除される可能性もあるため、新規コードでは使いません。

旧: keyCode(非推奨)
// 非推奨。数値で分かりにくく、レイアウト依存
document.addEventListener("keydown", (event) => {
  if (event.keyCode === 13) {
    console.log("Enterが押されました"); // 13 が何のキーか分かりにくい
  }
});

event.key と event.code の違い

代替手段は2つあり、目的で使い分けますevent.key入力された文字・キーの意味を、event.codeキーボード上の物理的な位置を表します。

キー event.key(意味) event.code(物理位置)
A(小文字) "a" "KeyA"
A(Shift併用) "A" "KeyA"
1(数字キー) "1" "Digit1"
Enter "Enter" "Enter"
左Shift "Shift" "ShiftLeft"
左Ctrl "Control" "ControlLeft"
左Alt "Alt" "AltLeft"
スペース " "(空白1文字) "Space"
↑矢印 "ArrowUp" "ArrowUp"
使い分けの目安:「Enterで送信」「a が入力された」のように文字の意味で判定したいときは event.key。ゲームの WASD移動のようにキーの位置で判定したい(キーボードレイアウトに左右されたくない)ときは event.code が向いています。
よくある誤解:左右のShiftはどちらも event.key では同じ "Shift" です。左右を区別したいときは event.code"ShiftLeft" / "ShiftRight")を見ます。"ShiftLeft"event.code の値であって event.key の値ではありません

keyCode からの移行表

古いコードを書き換えるときの対応表です。数値の keyCode を、意味の分かる event.key に置き換えます。

旧 keyCode キー 新 event.key
13 Enter "Enter"
27 Escape "Escape"
32 スペース " "
8 Backspace "Backspace"
9 Tab "Tab"
37〜40 矢印キー "ArrowLeft"〜"ArrowDown"

実装例①:event.key で文字・特殊キーを判定

Enterキーを判定
document.addEventListener("keydown", (event) => {
  if (event.key === "Enter") {
    console.log("Enterが押されました");
  }
});

実装例②:event.code で物理キーを判定(WASD移動)

ゲームの移動操作などは、レイアウトに依存しない event.code が便利です。

WASDで移動
document.addEventListener("keydown", (event) => {
  switch (event.code) {
    case "KeyW": console.log("上へ"); break;
    case "KeyA": console.log("左へ"); break;
    case "KeyS": console.log("下へ"); break;
    case "KeyD": console.log("右へ"); break;
  }
});

実装例③:Ctrl+S などの修飾キー

修飾キーは event.ctrlKey / event.shiftKey / event.altKey / event.metaKey(Mac の Command)で判定します。ブラウザ既定の動作を止めるには event.preventDefault() を呼びます。

Ctrl+S で保存(既定動作を抑制)
document.addEventListener("keydown", (event) => {
  if (event.ctrlKey && event.key === "s") {
    event.preventDefault(); // ブラウザの保存ダイアログを止める
    console.log("保存ショートカット");
  }
});

注意:日本語入力(IME)変換中の判定

日本語入力で変換中のEnter(変換確定)と、確定後のEnter(送信)は区別が必要です。変換中かどうかは event.isComposing で判定できます(変換中の keydown では keyCode229 になります)。

IME変換中のEnterを無視
const input = document.getElementById("text");

input.addEventListener("keydown", (event) => {
  // 変換確定のEnterは送信扱いしない
  if (event.isComposing || event.keyCode === 229) return;

  if (event.key === "Enter") {
    console.log("確定後のEnter(送信)");
  }
});
この罠を踏むと「日本語変換のEnterで勝手にフォーム送信される」不具合になります。フォームのEnter制御についてはエンターキーの送信を無効化する方法も参考になります。

keydown / keyup / keypress の違い

  • keydown:キーを押した瞬間に発火(押しっぱなしで連続発火)。現在の推奨
  • keyup:キーを離した瞬間に発火
  • keypress:文字入力時に発火するが非推奨(使わない)

よくある質問(FAQ)

Qキーボード入力のキーを取得する今の方法は?
Aevent.key(入力された文字・キーの意味)または event.code(物理キーの位置)を使います。event.keyCode は非推奨です。「Enterで送信」のような判定は event.key === "Enter" が簡潔です。
Qevent.key と event.code はどう使い分けますか?
A文字・意味で判定するなら event.keyキーの物理位置で判定するなら event.code です。WASD移動のようにレイアウトに左右されたくない場合は event.code、入力文字を見たい場合は event.key が向いています。
Q左右の Shift / Ctrl を区別するには?
Aevent.key はどちらも "Shift" / "Control" で同じです。左右を区別したいときは event.code"ShiftLeft" / "ShiftRight" を見ます。
Qkeydown と keyup と keypress の違いは?
Akeydown はキーを押した瞬間、keyup は離した瞬間に発火します。keypress は文字入力時に発火しますが非推奨です。現在は keydown の使用が推奨されています。

まとめ

JavaScriptでキーボード入力を取得する方法のポイントを整理します。

  • event.keyCode非推奨。新規実装では使わない
  • 文字・意味で判定→event.key"Enter", "a", "Shift"
  • 物理キー位置で判定→event.code"KeyA", "ShiftLeft"
  • 修飾キーは ctrlKey / shiftKey / altKey / metaKey
  • 日本語入力は event.isComposing で変換中を判定(誤送信を防ぐ)
  • イベントは keydown が推奨(keypress は非推奨)

関連として、フォームのエンターキー送信を無効化する方法バックスペースキーを無効化する方法もあわせて読むと、キー入力の制御に強くなれます。