現象重現
document.addEventListener("keypress", e => alert("press:" + e.keyCode));
document.addEventListener("keydown", e => alert("down:" + e.keyCode));
按下 w 鍵:keypress 彈 119(小寫 w),keydown 彈 87(大寫 W),相差 32。
根本原因
| 事件 | keyCode 含義 | 對應值 |
keydown/keyup | 鍵盤物理按鍵代碼 | 大寫字母碼(A=65...Z=90) |
keypress | 字符 ASCII/Unicode 代碼 | 實際輸入字符碼(a=97...z=122) |
大小寫字母 ASCII 碼相差 32('a' - 'A' = 32),故觀測到固定差值。
現代最佳實踐:棄用 keyCode
keyCode、charCode、which 均已棄用,推薦使用:
event.key:字符值("a", "Enter", "Shift")。
event.code:物理鍵位("KeyA", "Enter", "ShiftLeft")。
input.addEventListener('keydown', e => {
if (e.code === 'KeyA') { /* 物理 A 鍵 */ }
if (e.key === 'a') { /* 輸入字符 a */ }
});
兼容性處理
const getChar = (e) => e.key || String.fromCharCode(e.charCode || e.keyCode);
const getKeyCode = (e) => e.code || e.keyCode; // 過渡期兼容
參考資源
詳細表格見:JavaScript Event KeyCode 對照表
- 上一篇文章: C++ 未定義行為經典案例:i = i++ 輸出結果不確定
- 下一篇文章: Android Camera 預覽啟動失敗:SurfaceView addView 空指針異常排查
Copyright ©
程式碼之家 All Rights Reserved