KeyboardEvent
Baseline 广泛可用 *
KeyboardEvent 对象描述了用户与键盘的交互;每个事件描述了用户与键盘上的一个键(或一个键与修饰键的组合)之间的单次交互。事件类型(keydown、keypress 或 keyup)标识发生了哪种键盘活动。
注意:KeyboardEvent 事件仅在低级别指示用户与键盘上按键的交互,不提供该交互的上下文含义。当您需要处理文本输入时,请改用input事件。如果用户使用其他方式输入文本,例如平板电脑或图形输入板上的手写系统,则可能不会触发键盘事件。
构造函数
KeyboardEvent()-
创建一个新的
KeyboardEvent对象。
常量
KeyboardEvent 接口定义了以下常量。
键盘位置
以下常量标识按键事件源自键盘的哪个部分。它们以 KeyboardEvent.DOM_KEY_LOCATION_STANDARD 等方式访问。
| 常量 | 值 | 描述 |
|---|---|---|
DOM_KEY_LOCATION_STANDARD |
0x00 |
事件描述的键未被标识为位于键盘的特定区域;它不在数字键盘上(除非是 NumLock 键),并且对于键盘左右两侧重复的键,无论出于何种原因,该键都不与该位置关联。 示例包括标准 PC 101 US 键盘上的字母数字键、NumLock 键和空格键。 |
DOM_KEY_LOCATION_LEFT |
0x01 |
该键可能存在于键盘的多个位置,在此情况下,它位于键盘的左侧。 示例包括左 Control 键、Macintosh 键盘上的左 Command 键或左 Shift 键。 |
DOM_KEY_LOCATION_RIGHT |
0x02 |
该键可能存在于键盘的多个位置,在此情况下,它位于键盘的右侧。 示例包括右 Shift 键和右 Alt 键(Mac 键盘上的 Option 键)。 |
DOM_KEY_LOCATION_NUMPAD |
0x03 |
该键位于数字键盘上,或者是与数字键盘关联的虚拟键,如果该键可能源自多个位置的话。NumLock 键不属于此组,并且始终以 示例包括数字键盘上的数字、数字键盘的 Enter 键和数字键盘上的小数点。 |
实例属性
此接口还继承其父级 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。
已废弃的属性
KeyboardEvent.charCode已弃用 只读-
返回一个数字,表示键的 Unicode 参考号;此属性仅由
keypress事件使用。对于其char属性包含多个字符的键,这是该属性中第一个字符的 Unicode 值。在 Firefox 26 中,这会返回可打印字符的代码。 KeyboardEvent.keyCode已弃用 只读-
返回一个数字,表示一个系统和实现相关的数字代码,用于标识按下的键的未修改值。
KeyboardEvent.keyIdentifier非标准 已弃用 只读-
此属性为非标准属性,已弃用,建议改用
KeyboardEvent.key。它曾是 DOM Level 3 Events 旧版本的一部分。
实例方法
此接口还继承了其父级 UIEvent 和 Event 的方法。
KeyboardEvent.getModifierState()-
返回一个布尔值,指示在创建事件时是否按下了修饰键,例如 Alt、Shift、Ctrl 或 Meta。
已废弃的方法
KeyboardEvent.initKeyboardEvent()已弃用-
初始化一个
KeyboardEvent对象。此方法现已弃用。您应该改用KeyboardEvent()构造函数。
事件
以下事件基于 KeyboardEvent 类型。在下面的列表中,每个事件都链接到该事件的 Element 处理程序的文档,该处理程序通常适用于所有接收者,包括 Element、Document 和 Window。
废弃事件
keypress已弃用-
通常会产生字符值的按键已被按下。此事件高度依赖于设备且已废弃。您不应使用它。
用法说明
有三种类型的键盘事件:keydown、keypress 和 keyup。对于大多数按键,Gecko 会按以下方式分发一系列按键事件:
- 当第一次按下键时,会发送
keydown事件。 - 如果按键不是修饰键,则发送
keypress事件。 - 当用户释放按键时,会发送
keyup事件。
特殊情况
某些键会切换指示灯的状态;这些键包括 Caps Lock、Num Lock 和 Scroll Lock 等键。在 Windows 和 Linux 上,这些键只分发 keydown 和 keyup 事件。
注意:在 Linux 上,Firefox 12 及更早版本也为这些键分发了 keypress 事件。
然而,macOS 事件模型的限制导致 Caps Lock 只分发 keydown 事件。Num Lock 在一些较旧的笔记本电脑型号(2007 年及更早型号)上受支持,但从那时起,macOS 即使在外部键盘上也不支持 Num Lock。在带有 Num Lock 键的旧款 MacBook 上,该键不生成任何键事件。如果连接了带 F14 键的外部键盘,Gecko 支持 Scroll Lock 键。在某些旧版本的 Firefox 中,此键会生成 keypress 事件;这种不一致的行为是 Firefox bug 602812。
自动重复处理
当按键被按下并按住时,它会开始自动重复。这会导致一系列事件被分发,类似于以下内容:
keydownkeypresskeydownkeypress- <<重复直到用户释放按键>>
keyup
这是 DOM Level 3 规范所说的应该发生的情况。然而,有一些注意事项,如下所述。
在某些 GTK 环境中自动重复,例如 Ubuntu 9.4
在某些基于 GTK 的环境中,自动重复会在自动重复期间自动分发原生按键抬起事件,并且 Gecko 无法区分重复的按键系列和自动重复。因此,在这些平台上,自动重复键将生成以下事件序列:
keydownkeypresskeyupkeydownkeypresskeyup- <<重复直到用户释放按键>>
keyup
在这些环境中,不幸的是,Web 内容无法区分自动重复键和仅仅是重复按下的键。
示例
document.addEventListener("keydown", (event) => {
const keyName = event.key;
if (keyName === "Control") {
// do not alert when only Control key is pressed.
return;
}
if (event.ctrlKey) {
// Even though event.key is not 'Control' (e.g., 'a' is pressed),
// event.ctrlKey may be true if Ctrl key is pressed at the same time.
alert(`Combination of ctrlKey + ${keyName}`);
} else {
alert(`Key pressed ${keyName}`);
}
});
document.addEventListener("keyup", (event) => {
const keyName = event.key;
// As the user releases the Ctrl key, the key is no longer active,
// so event.ctrlKey is false.
if (keyName === "Control") {
alert("Control key was released");
}
});
规范
| 规范 |
|---|
| UI 事件 # 接口-键盘事件 |
KeyboardEvent 接口规范经历了无数草案版本,首先在 DOM Events Level 2 中因未能达成共识而被放弃,然后是 DOM Events Level 3。这导致了非标准初始化方法的实现,早期 DOM Events Level 2 版本 KeyboardEvent.initKeyEvent() 由 Gecko 浏览器实现,以及早期 DOM Events Level 3 版本 KeyboardEvent.initKeyboardEvent() 由其他浏览器实现。两者都已被现代构造函数 KeyboardEvent() 取代。
浏览器兼容性
加载中…
兼容性说明
- 从 Firefox 65 开始,对于不可打印的键(Firefox bug 968056),不再触发
keypress事件,但 Enter 键以及 Shift + Enter 和 Ctrl + Enter 键组合除外(这些是为了跨浏览器兼容性而保留的)。