元素:keydown 事件

keydown 事件在按下键盘按键时触发。

与已弃用的 keypress 事件不同,keydown 事件会针对所有按键触发,而不管它们是否生成字符值。

keydownkeyup 事件提供了一个代码,指示哪个按键被按下,而 keypress 指示哪个字符被输入。例如,小写字母“a”将被 keydownkeyup 报告为 65,但被 keypress 报告为 97。大写字母“A”则被所有事件报告为 65。

键盘事件的事件目标是当前正在处理键盘活动的聚焦元素。这包括:<input><textarea>、任何 contentEditable 的元素,以及任何其他可以通过键盘交互的元素,例如 <a><button><summary>。如果没有任何合适的元素处于焦点状态,则事件目标将是 <body> 或根元素。如果没有捕获,则事件会 冒泡 上升到 DOM 树,直到到达 Document

事件目标可能会在不同的键盘事件之间发生变化。例如,按下 Tab 键时的 keydown 目标将不同于 keyup 目标,因为焦点已更改。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

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

onkeydown = (event) => {};

事件类型

事件属性

此接口也继承了其父级 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 事件现在在 IME 组合期间触发,以提高 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 事件
# event-type-keydown
HTML 标准
# handler-onkeydown

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。

另请参阅