元素:keydown 事件
keydown
事件在按下键盘按键时触发。
与已弃用的 keypress
事件不同,keydown
事件会针对所有按键触发,而不管它们是否生成字符值。
keydown
和 keyup
事件提供了一个代码,指示哪个按键被按下,而 keypress
指示哪个字符被输入。例如,小写字母“a”将被 keydown
和 keyup
报告为 65,但被 keypress
报告为 97。大写字母“A”则被所有事件报告为 65。
键盘事件的事件目标是当前正在处理键盘活动的聚焦元素。这包括:<input>
、<textarea>
、任何 contentEditable
的元素,以及任何其他可以通过键盘交互的元素,例如 <a>
、<button>
和 <summary>
。如果没有任何合适的元素处于焦点状态,则事件目标将是 <body>
或根元素。如果没有捕获,则事件会 冒泡 上升到 DOM 树,直到到达 Document
。
事件目标可能会在不同的键盘事件之间发生变化。例如,按下 Tab 键时的 keydown
目标将不同于 keyup
目标,因为焦点已更改。
语法
在诸如 addEventListener()
之类的方法中使用事件名称,或设置事件处理程序属性。
addEventListener("keydown", (event) => {});
onkeydown = (event) => {};
事件类型
一个 KeyboardEvent
。继承自 UIEvent
和 Event
。
事件属性
此接口也继承了其父级 UIEvent
和 Event
的属性。
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
值。
<input placeholder="Click here, then press down a key." size="40" />
<p id="log"></p>
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 开始,keydown
和 keyup
事件现在在 IME 组合期间触发,以提高 CJKT 用户的跨浏览器兼容性 (Firefox bug 354358)。要忽略所有作为组合一部分的 keydown
事件,请执行以下操作(229 是为与 IME 处理过的事件相关的 keyCode
设置的特殊值)
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 的浏览器中加载。