Element: keydown 事件

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

當按下某個鍵時,會觸發 keydown 事件。

與已廢棄的 keypress 事件不同,keydown 事件會為所有鍵觸發,無論它們是否生成字元值。

keydownkeyup 事件提供一個表示按下了哪個鍵的程式碼,而 keypress 表示輸入了哪個字元。例如,小寫字母“a”將由 keydownkeyup 報告為 65,但由 keypress 報告為 97。大寫字母“A”將由所有事件報告為 65。

按鍵事件的事件目標是當前正在處理鍵盤活動的焦點元素。這包括:<input><textarea>、任何 contentEditable 的元素,以及其他可以透過鍵盤進行互動的元素,例如 <a><button><summary>。如果沒有合適的元素獲得焦點,事件目標將是 <body> 或根元素。該事件會冒泡。它可以到達 DocumentWindow

不同的按鍵事件之間,事件目標可能會改變。例如,按下 Tab 鍵的 keydown 目標將與 keyup 目標不同,因為焦點已改變。

語法

在諸如 addEventListener() 之類的方法中使用事件名稱,或設定事件處理程式屬性。

js
addEventListener("keydown", (event) => { })

onkeydown = (event) => { }

事件型別

一個 KeyboardEvent。繼承自 UIEventEvent

Event UIEvent KeyboardEvent

事件屬性

此介面還繼承其父級 UIEventEvent 的屬性。

KeyboardEvent.altKey 只讀

返回一個布林值,如果生成按鍵事件時 Alt 鍵(macOS 上為 Option 鍵)處於活動狀態,則返回 true

KeyboardEvent.code 只讀

返回一個字串,其中包含事件所代表的物理鍵的程式碼值。

警告: 這會忽略使用者的鍵盤佈局,因此如果使用者在 QWERTY 鍵盤佈局中按下 "Y" 位置的鍵(在主行上方一行的中間附近),這將始終返回 "KeyY",即使使用者使用的是 QWERTZ 鍵盤(這意味著使用者期望一個 "Z",所有其他屬性也將指示一個 "Z")或 Dvorak 鍵盤佈局(使用者期望一個 "F")。如果你想向用戶顯示正確的按鍵,可以使用 Keyboard.getLayoutMap()

KeyboardEvent.ctrlKey 只讀

返回一個布林值,如果生成按鍵事件時 Ctrl 鍵處於活動狀態,則返回 true

KeyboardEvent.isComposing 只讀

返回一個布林值,如果事件在 compositionstart 之後和 compositionend 之前觸發,則返回 true

KeyboardEvent.key 只讀

返回一個字串,表示事件所代表的鍵的鍵值。

KeyboardEvent.location 只讀

返回一個數字,表示鍵盤或其他輸入裝置上按鍵的位置。標識位置的常量列表顯示在鍵盤位置中。

KeyboardEvent.metaKey 只讀

返回一個布林值,如果生成按鍵事件時 Meta 鍵(Mac 鍵盤上的 ⌘ Command 鍵;Windows 鍵盤上的 Windows 鍵 ())處於活動狀態,則返回 true

KeyboardEvent.repeat 只讀

返回一個布林值,如果按鍵被按住並自動重複,則返回 true

KeyboardEvent.shiftKey 只讀

返回一個布林值,如果生成按鍵事件時 Shift 鍵處於活動狀態,則返回 true

示例

addEventListener keydown 示例

此示例會在您按下 <input> 元素內的任意鍵時記錄 KeyboardEvent.code 值。

html
<input placeholder="Click here, then press down a key." size="40" />
<p id="log"></p>
js
const input = document.querySelector("input");
const log = document.getElementById("log");

input.addEventListener("keydown", logKey);

function logKey(e) {
  log.textContent += ` ${e.code}`;
}

帶有 IME 的 keydown 事件

自 Firefox 65 起,keydownkeyup 事件現在在輸入法編輯器組合期間觸發,以改善 CJKT 使用者的跨瀏覽器相容性(Firefox bug 354358)。要忽略所有屬於組合部分的 keydown 事件,請執行以下操作(229 是與已被 IME 處理的事件相關的 keyCode 的特殊值):

js
eventTarget.addEventListener("keydown", (event) => {
  if (event.isComposing || event.keyCode === 229) {
    return;
  }
  // do something
});

注意:當輸入第一個字元以開啟 IME 時,compositionstart 可能會在 keydown 之後觸發;當輸入最後一個字元以關閉 IME 時,compositionend 可能會在 keydown 之前觸發。在這些情況下,即使事件是組合的一部分,isComposing 也為 false。但是,KeyboardEvent.keyCode 在這些情況下仍然是 229,因此仍然建議檢查 keyCode,儘管它已棄用。

規範

規範
UI 事件
# 事件型別-keydown
HTML
# 處理程式-onkeydown

瀏覽器相容性

另見