フォームのEnter送信やショートカットキーなど、JavaScriptでキーボード入力を判定したい場面は多くあります。かつては event.keyCode が使われていましたが、現在は非推奨です。今は event.key と event.code を使い分けるのが正解です。
event.key(例:"a", "Enter", "Shift")、キーボード上の「物理的な位置」で判定するなら event.code(例:"KeyA", "ShiftLeft")を使います。event.keyCode は非推奨なので新規実装では使いません。event.keyCode は非推奨
event.keyCode は押されたキーを数値で返すプロパティでした(Enterなら13など)。しかしキーボードレイアウトやIMEで値が安定せず、仕様上も非推奨(deprecated)です。読みづらく将来削除される可能性もあるため、新規コードでは使いません。
// 非推奨。数値で分かりにくく、レイアウト依存
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" |
a が入力された」のように文字の意味で判定したいときは event.key。ゲームの WASD移動のようにキーの位置で判定したい(キーボードレイアウトに左右されたくない)ときは event.code が向いています。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 で文字・特殊キーを判定
document.addEventListener("keydown", (event) => {
if (event.key === "Enter") {
console.log("Enterが押されました");
}
});
実装例②:event.code で物理キーを判定(WASD移動)
ゲームの移動操作などは、レイアウトに依存しない event.code が便利です。
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() を呼びます。
document.addEventListener("keydown", (event) => {
if (event.ctrlKey && event.key === "s") {
event.preventDefault(); // ブラウザの保存ダイアログを止める
console.log("保存ショートカット");
}
});
注意:日本語入力(IME)変換中の判定
日本語入力で変換中のEnter(変換確定)と、確定後のEnter(送信)は区別が必要です。変換中かどうかは event.isComposing で判定できます(変換中の keydown では keyCode が 229 になります)。
const input = document.getElementById("text");
input.addEventListener("keydown", (event) => {
// 変換確定のEnterは送信扱いしない
if (event.isComposing || event.keyCode === 229) return;
if (event.key === "Enter") {
console.log("確定後のEnter(送信)");
}
});
keydown / keyup / keypress の違い
keydown:キーを押した瞬間に発火(押しっぱなしで連続発火)。現在の推奨keyup:キーを離した瞬間に発火keypress:文字入力時に発火するが非推奨(使わない)
よくある質問(FAQ)
event.key(入力された文字・キーの意味)または event.code(物理キーの位置)を使います。event.keyCode は非推奨です。「Enterで送信」のような判定は event.key === "Enter" が簡潔です。event.key、キーの物理位置で判定するなら event.code です。WASD移動のようにレイアウトに左右されたくない場合は event.code、入力文字を見たい場合は event.key が向いています。event.key はどちらも "Shift" / "Control" で同じです。左右を区別したいときは event.code の "ShiftLeft" / "ShiftRight" を見ます。keydown はキーを押した瞬間、keyup は離した瞬間に発火します。keypress は文字入力時に発火しますが非推奨です。現在は keydown の使用が推奨されています。まとめ
JavaScriptでキーボード入力を取得する方法のポイントを整理します。
event.keyCodeは非推奨。新規実装では使わない- 文字・意味で判定→
event.key("Enter","a","Shift") - 物理キー位置で判定→
event.code("KeyA","ShiftLeft") - 修飾キーは
ctrlKey/shiftKey/altKey/metaKey - 日本語入力は
event.isComposingで変換中を判定(誤送信を防ぐ) - イベントは
keydownが推奨(keypressは非推奨)
関連として、フォームのエンターキー送信を無効化する方法・バックスペースキーを無効化する方法もあわせて読むと、キー入力の制御に強くなれます。
