經典 keyCode 對照表 (僅供維護舊代碼參考)
| 按鍵 | keyCode | 備註 |
| Backspace | 8 | |
| Tab | 9 | |
| Enter | 13 | |
| Shift | 16 | |
| Ctrl | 17 | |
| Alt | 18 | |
| Esc | 27 | |
| Space | 32 | |
| PageUp | 33 | |
| PageDown | 34 | |
| End | 35 | |
| Home | 36 | |
| ← | 37 | |
| ↑ | 38 | |
| → | 39 | |
| ↓ | 40 | |
| Insert | 45 | |
| Delete | 46 | |
| 0-9 | 48-57 | 主鍵盤 |
| A-Z | 65-90 | 不分大小寫 |
| 小鍵盤 0-9 | 96-105 | |
| 小鍵盤 * | 106 | |
| 小鍵盤 + | 107 | |
| 小鍵盤 - | 109 | |
| 小鍵盤 . | 110 | |
| 小鍵盤 / | 111 | |
| F1-F12 | 112-123 | |
| NumLock | 144 | |
| ScrollLock | 145 | |
| ; : | 186 | |
| = + | 187 | |
| , < | 188 | |
| - _ | 189 | |
| . > | 190 | |
| / ? | 191 | |
| ` ~ | 192 | |
| [ { | 219 | |
| \ | | 220 | |
| ] } | 221 | |
| ' " | 222 | |
⚠️ keyCode 已棄用:現代標準屬性
| 屬性 | 類型 | 值範例 | 用途 |
event.key | String | "Enter", "a", "ArrowLeft", "Shift" | **推薦**:語義清晰,包含修飾鍵組合結果 |
event.code | String | "KeyA", "ArrowLeft", "ShiftLeft" | 物理鍵位,不受鍵盤佈局影響 |
event.keyCode | Number | 13, 65, 37 | **棄用**:數值無語義,跨瀏覽器不一致 |
event.which | Number | 同 keyCode | **棄用**:非標準 |
現代最佳實踐代碼範例
<input id="search" placeholder="按 Enter 搜尋" />
<script>
document.getElementById("search").addEventListener("keydown", function(e) {
// 1. 使用 event.key 判斷 Enter
if (e.key === "Enter") {
e.preventDefault(); // 防止表單提交等默認行為
doSearch(this.value);
}
// 2. 組合鍵判斷:event.ctrlKey / shiftKey / altKey / metaKey
if (e.key === "s" && (e.ctrlKey || e.metaKey)) { // Ctrl+S / Cmd+S
e.preventDefault();
saveDraft();
}
// 3. 物理鍵位判斷 (遊戲/快捷鍵綁定)
if (e.code === "Space") { jump(); } // 無論鍵盤佈局
});
</script>
特殊鍵 `event.key` 值速查
// 功能鍵
"Enter", "Tab", "Escape", "Backspace", "Delete", "Insert"
"ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"
"Home", "End", "PageUp", "PageDown"
"CapsLock", "NumLock", "ScrollLock"
"F1" - "F12"
"PrintScreen", "Pause", "ContextMenu"
// 修飾鍵 (單獨按下時)
"Shift", "Control", "Alt", "Meta" (Win/Command)
"ShiftLeft", "ControlRight" 等 (event.code 區分左右)
// 空白鍵
" " (空字符串) // 注意:event.key === " " 而非 "Spacebar"
跨瀏覽器兼容策略 (漸進增強)
function getKey(event) {
// 標準優先
if (event.key) return event.key;
// 兼容舊瀏覽器 (IE ≤ 10)
var keyMap = {
8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Control",
18: "Alt", 27: "Escape", 32: " ", 37: "ArrowLeft", 38: "ArrowUp",
39: "ArrowRight", 40: "ArrowDown", 46: "Delete"
};
return keyMap[event.keyCode] || String.fromCharCode(event.keyCode);
}
// 使用
element.addEventListener("keydown", function(e) {
var key = getKey(e);
if (key === "Enter") { ... }
});
常見誤區避雷
- `keypress` 事件已棄用**:改用 `keydown` (所有鍵) 或 `beforeinput` (文字輸入)。
- 大小寫判斷**:`e.key === "a"` 只匹配小寫;大寫為 `"A"`。組合鍵用 `e.shiftKey` 輔助判斷。
- 中文輸入法**:`keydown` 觸發時 `e.key` 可能為 `"Process"` 或 `"Unidentified"`,實際文字在 `compositionend` / `input` 事件獲取。
- 無障礙**:自定義快捷鍵需提供修改/關閉選項,避免與螢幕閱讀器、瀏覽器內建快捷鍵衝突。