鍵碼檢視器
按下按鍵即可讀取 KeyboardEvent 的全部屬性:key、code、keyCode、which、location 以及 ctrl、shift、alt、meta 標誌,並可複製完整 JSON。
按下一個鍵,看看瀏覽器究竟報告了什麼。 點選下方捕獲區域,然後按下任意按鍵或組合鍵。KeyboardEvent 的每個屬性都會並排顯示,讓你在編寫快捷鍵處理邏輯時能選對屬性,而不是靠猜。
按下按鍵即可讀取 KeyboardEvent 的全部屬性:key、code、keyCode、which、location 以及 ctrl、shift、alt、meta 標誌,並可複製完整 JSON。
按下一個鍵,看看瀏覽器究竟報告了什麼。 點選下方捕獲區域,然後按下任意按鍵或組合鍵。KeyboardEvent 的每個屬性都會並排顯示,讓你在編寫快捷鍵處理邏輯時能選對屬性,而不是靠猜。
KeyboardEvent 提供了多種標識按鍵的方式,它們回答的問題其實各不相同。event.key 是在應用鍵盤佈局和修飾鍵之後,按鍵所產生的字元或具名值。按下物理 A 鍵得到 a,同時按住 Shift 得到 A,而在 Dvorak 或 AZERTY 佈局上則可能是完全不同的字母。具名按鍵會以描述性字串出現,例如 Enter、Escape、ArrowLeft 和 F5。
event.code 標識的則是物理按鍵位置,使用一套與佈局無關、基於假想美式鍵盤的名稱。位於 A 鍵位置的按鍵始終是 KeyA,無論使用者佈局實際輸出什麼。頂部數字行是 Digit1 到 Digit0,數字小鍵盤則報告 Numpad1 之類的名稱,因此你能區分兩排數字。
event.keyCode 及其孿生的 event.which 是遺留的數字識別符號。二者在規範上均已廢棄,卻依然在所有瀏覽器中實現,並且對標點符號的取值在各瀏覽器間並不一致。維護老程式碼時它們仍值得關注,但新的快捷鍵處理應當使用 key 或 code。
經驗法則很簡單:位置重要時用 code,含義重要時用 key。把移動繫結到 WASD 的遊戲應該用 code,因為玩家左手下方的那一簇物理按鍵在 AZERTY 鍵盤上應保持原位,儘管它實際輸出的是 ZQSD。把「儲存」繫結到 Ctrl+S 的文本編輯器則應該用 key,因為使用者想到的是字母 S,而不是 A 旁邊的那個鍵。
修飾鍵是獨立的布林值:ctrlKey、shiftKey、altKey 和 metaKey。請顯式檢測它們,而不要從 key 推斷;同時要記住主快捷鍵修飾符在 macOS 上是 Command,在其他平臺上是 Control。常見寫法是接受 event.metaKey || event.ctrlKey,讓同一段處理邏輯覆蓋兩個平臺。
event.location 用於區分重複按鍵。標準按鍵為 0,成對按鍵中的左側(如左 Shift)為 1,右側為 2,數字小鍵盤上的按鍵為 3。
並非所有按鍵都會產生你期望的事件。瀏覽器會為自己保留一些組合——Ctrl+W、Ctrl+T 和 Command+Q 通常在頁面看到之前就已關閉標籤頁或退出應用,preventDefault 也無法奪回它們。任何快捷鍵都應在真實瀏覽器視窗中測試,而不要假定它一定能到達你的處理函式。
按住某個鍵會在首次事件之後產生一連串重複事件,其 event.repeat 為 true。若快捷鍵只應觸發一次,就忽略重複事件;若行為是連續性的(例如滾動或移動游標),則應當響應它們。
最後,keydown 與 keyup 描述的是按鍵,而描述字元的 keypress 已從標準中移除。處理文本輸入時,更推薦監聽 input 事件或讀取 beforeinput,它們對輸入法組字、自動完成和移動端鍵盤的處理都遠比任何按鍵級事件可靠。