Element:keydown 事件
>keydown 事件在某个键被按下时触发。
与已弃用的 keypress 事件不同,keydown 事件会针对所有按键触发,无论它们是否产生字符值。
keydown 和 keyup 事件提供一个表明按下了哪个键的代码,而 keypress 表明输入了哪个字符。例如,小写字母“a”在 keydown 和 keyup 中会被报告为 65,但在 keypress 中为 97。所有事件均将大写字母“A”报告为 65。
按键事件的事件目标是当前正在处理键盘操作的焦点元素。这包括:<input>、<textarea>、任何设置了 contentEditable 的元素,以及其他可通过键盘交互的元素,例如 <a>、<button> 和 <summary>。如果没有合适的元素处于焦点,事件目标将是 <body> 或根元素。此事件会冒泡。它可以到达 Document 和 Window。
不同按键事件之间,事件目标可能会改变。例如,按下 Tab 键时,keydown 的目标会与 keyup 的目标不同,因为焦点已经改变。
语法
在 addEventListener() 等方法中使用事件名称,或设置事件处理器属性。
addEventListener("keydown", (event) => { })
onkeydown = (event) => { }
事件类型
KeyboardEvent。继承自 UIEvent 和 Event。
示例
>addEventListener keydown 示例
每当你在 <input> 元素内按下某个键时,此示例会记录 KeyboardEvent.code 的值。
<input placeholder="点这里,然后按下某个键。" 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 事件现在会在输入法编辑器的组合期间触发,以提升 CJKT 用户的跨浏览器兼容性(Firefox bug 354358)。要忽略所有属于组合过程的 keydown 事件,可以像下面这样做(229 是与已被 IME 处理的事件相关的 keyCode 特殊值):
eventTarget.addEventListener("keydown", (event) => {
if (event.isComposing || event.keyCode === 229) {
return;
}
// 执行某些操作
});
备注:键入打开输入法的第一个字符时,compositionstart 可能在 keydown 之后触发;键入关闭输入法的最后一个字符时,compositionend 可能在 keydown 之前触发。在这些情况下,即使事件属于组合过程,isComposing 仍为 false。不过,此时 KeyboardEvent.keyCode 仍为 229,因此尽管 keyCode 已弃用,仍建议一并检查它。
规范
| 规范 |
|---|
| UI Events> # event-type-keydown> |
| HTML> # handler-onkeydown> |