用户界面事件(UI Events)

翻译草案,

More details about this document
This version:
https://mangwu.github.io/uievents-cn
Latest published version:
https://w3c.github.io/uievents/
上个版本:
https://www.w3.org/TR/2022/WD-uievents-20220913/
规范反馈:
GitHub-w3c-uievents-issues
翻译反馈:
GitHub-mangwu-uievents-cn-issues
编辑者:
(Google)
(Microsoft)
翻译者:
前作者:
Doug Schepers, Mar 2008 - May 2011
测试:
web-platform-tests uievents/
( 开发中 )

Abstract

摘要

本规范定义了用户界面事件,它扩展了 [DOM] 中定义的DOM事件对象。 用户界面事件通常由视觉用户代理实现,用于处理用户交互,如鼠标和键盘输入。

文档状态

本节介绍了本文件发布时的状态。 当前 W3C 出版物列表和本技术报告的最新修订版可在 W3C 技术报告索引 中找到,网址为 https://www.w3.org/TR/ 。

本文件由 网络应用程序工作组 作为 编辑草稿 (Editors Draft)发布。 本文档旨在成为W3C推荐标准

本文件由 网络应用程序工作组 作为 工作草案 (Working Draft)发布。 欢迎对本规范提出反馈和意见。请使用 GitHub issues 对源文档进行问题讨论; 请使用 GitHub issues 对翻译文档进行问题讨论; 官方的问题存档地址为 public-webapps@w3.org archives

作为编辑草案出版并不意味着 W3C 及其成员的认可。 这是一份草案文档,可以随时被其他文档更新、替换或作废。 本文档不适合被其它正在编写的规范作为引用。

本文档由一个根据 W3C 专利政策 运作的小组编写。 W3C 保留了一份与该小组可交付成果相关的 所有可披露专利的公开列表 ; 该页面还包括公开一份专利的说明。 对认为包含 基本权利要求 (Essential Claim(s))的专利有实际了解的个人必须根据 W3C专利政策第6节 公开信息。

本文件受 2021 11月2日 W3C处理文档 规范管理。

Status of this document

1. 简介

1.1. 概述

UI Events的设计有两个主要目标。第一个目标是设计一个 事件 系统,该系统允许注册 事件侦听器 ,并通过树形结构描述事件流。此外, 该规范将为用户界面控制和文档变更通知提供标准的事件模块, 包括为每个事件模块定义的上下文信息。

UI Events的第二个目标是提供现有浏览器中使用的所有当前事件系统的公共子集。 这是为了促进现有脚本和内容的互操作性。我们并不期望这个目标能够完全向后兼容。 但是,该规范力图在可能的情况下实现这一点。

1.2. 一致性

本节是规范的。

在本规范中,关键字 MUSTMUST NOTREQUIREDSHALLSHALL NOTSHOULDSHOULD NOTRECOMMENDEDMAYOPTIONAL 的解释如 [RFC2119] 中所述。

此规范应在DOM Level 3 Core 规范 [DOM-Level-3-Core] 的背景下理解, 并适用于DOM实现的一般考虑。例如,在XML名称空间中讨论了 命名空间 URI 的处理。 有关 一致性 的其他信息,请参阅 DOM Level 3 Core 规范 [DOM-Level-3-Core] 。 为了符合本规范, 用户代理 不需要完全符合另一个规范,但它 必须 符合本规范中引用的任何其他规范的特定部分 (例如,一个符合用户界面事件的 用户代理 必须 支持 [WebIDL] 中定义的 DOMString 数据类型,但不需要为了符合用户界面事件支持 [WebIDL] 中定义的每个方法或数据类型)。

本规范为不同的 用户代理 、规范和内容作者定义了几类一致性:

1.2.1. Web 浏览器和其他动态或交互式的 用户代理

一个动态的或交互式的 用户代理 ,在这里被称为 浏览器 (无论是 Web 浏览器, AT ( Accessibility Technolog ,无障碍技术)应用程序, 或其他类似的程序),要符合用户界面事件规范, 用户代理需要支持:

当为 事件类型 定义的(触发事件的)条件得到满足时,符合规范的浏览器 必须 恰当地在给定 EventTarget派发 对应事件。

如果浏览器实现了定义在 § 5 事件类型 中的接口和相关的 事件类型 , 则它局限性地(specifically)符合用户界面事件规范。

一个符合规范的浏览器 必须 支持脚本、 声明性交互,或者能以本规范描述的方式检测和派发事件, 并且 必须 支持为该 事件类型 定义的 APIs 。

为了向后兼容现有内容,除了满足所有其他一致性标准之外, 符合规范的浏览器还 可以 实现此规范已标记为 弃用 的特性, 但不鼓励这样的实现。

一个符合规范的浏览器也 可以 支持本规范中没有的特性,但它实现了 § 3.1 事件派发和 DOM 事件流 机制、接口、事件或本规范中定义的其他特性,并且 可以 实现适合于该浏览器实现的附加接口和 事件类型 。这些特性可能在未来的规范中标准化。

不符合此规范所有要求实现的部分的浏览器 不得 声明符合用户界面事件规范。 这种符合本规范部分要求的实现 可以 声称符合那些特定部分。

如 Web IDL 规范 [WebIDL] 所述, 一个符合规范的浏览器也 必须 是本规范中 IDL 片段的 符合实现(conforming implementation)

1.2.2. 创作工具

如果一个内容创作工具生成的内容基于 事件类型§ 3.1 事件派发和 DOM 事件流 模型,并且与本规范中定义的方式一致, 那么它就符合用户界面事件规范。

如果内容创作工具使用了本规范中被标记为 弃用 的特性,那么它生成的内容 不得 声称符合用户界面事件规范。

符合规范的内容创作工具 应当 为内容作者提供一种方法,使其能够在生成的内容文档中使用适用于所有 宿主语言 的所有 事件类型 和接口。

这里的创作工具可以理解为开发工具,内容创作工具理解为 Web 开发工具。本规范中说的内容,作者,创作都 可以 从开发者的角度去理解,参见 作者

1.2.3. 内容作者和内容

如果一个内容 作者 创建的内容基于 事件类型§ 3.1 事件派发和 DOM 事件流 模型,并且与本规范中定义的方式一致, 那么它就是符合用户界面事件规范的内容。

内容作者 不应 使用本规范中标记 弃用 的特性,而 应当 依靠定义在本规范和其他规范的替换机制(replacement mechanisms)。

符合规范的内容 必须 使用本规范中描述的接口和 事件类型 的语义。

建议内容作者遵循在 无障碍国际化 指南规范中描述的最佳实践。

1.2.4. 规范和宿主语言

如果一个规范或 宿主语言 引用并使用本规范中的 § 3.1 事件派发和 DOM 事件流 机制、接口、事件或 在 [DOM] 中定义的其他特性,并且不会以不兼容的方式扩展这些特性, 那么它就是符合用户界面事件规范的。

如果规范或 宿主语言 引用并使用在 § 5 事件类型 中指定的接口和相关 事件类型 , 那么它局限性地(specifically)符合用户界面事件规范。 符合本规范的规范 可以 定义适用于其自身的附件接口和 事件类型 ,或者 可以 以,与本规范中的接口和 事件类型 的定义 不矛盾或不冲突的方式,去扩展用户界面事件接口和 事件类型

引用用户界面事件的规范或 宿主语言 不应 使用或推荐被本规范标记 弃用 的特性,但 应当 使用或建议改特性指定的替代(如果可用)。

2. 格式规约

本规范遵循 建议的W3C规范惯例 ,并添加了以下补充内容:

此外,本规范中会使用具有特定含义的一些术语。术语 实现(implementation) 适用于指代实现本规范的浏览器、内容创作工具或其他 用户代理 ,而内容作者是指编写脚本或代码的人, 这些脚本或代码利用本规范中描述的接口、方法、属性、 事件和其他功能来制作 Web 应用程序,并且用户是在一个实现中使用这些 Web 应用程序的人。

最后:

这是一条注释。

这是一个例子。

这是一个悬而未决的问题。

这是一个警告。

interface Example {
    // 这是一个IDL定义。
};

2.1. 非官方的翻译规约

本节不是规范的。

本节为译者自行添加, 不属于 英文规范原档内容, 且本节是对翻译过程中的中文翻译,文本样式以及内容补充说明。

2.1.1. 中文翻译

本文档翻译的 UI Events 规范基于 https://www.w3.org/TR/2022/WD-uievents-20220913/。 翻译工作量巨大,翻译时借助了辅助工具,难免出现错误或遗漏的地方, 请不要把本文档当作规范看待,可以当成英文原文档规范的学习参考。

§ 1.2 一致性 中提到了一些英文大写关键字, 这些关键字都翻译成了中文,翻译参考自 shibei-rfc2119 ,非规范表格如下:

中文 英文 描述
【必须】 MUST, SHALL 其所修饰的定义是规范的绝对必要条件。
【不得】 MUST NOT, SHALL NOT 其所修饰的定义是规范的绝对禁止条件。
【必要的】 REQUIRED 解释同【必须】,只是这里是形容词。
【应当】 SHOULD 特定的情况下,可能存在着正当的理由, 来忽略某一具体的条目; 但是,在选择不同的方案前, 必须理解并仔细权衡该行为背后的完整含义。
【不应】 SHOULD NOT 在特定的情况下,可能存在着正当的理由, 使得某一具体行为变得可接受,甚至是有用; 但是, 在实现此标签所描述的任何行为前, 应当理解其背后的完整含义, 并仔细权衡各个情况。
【推荐的】 RECOMMENDED 解释同【应当】,只是这里是形容词。
【不推荐的】 NOT RECOMMENDED 解释同【不应】,只是这里是形容词。
【可以】 MAY 一个条目是真正可选的。某一供应商可能会出于: 特殊的市场需求的原因、 或认为某一条目可以提高产品的原因,而选择实现该条目 ; 但是, 另一些供应商也可以选择省略该条目。
【可选的】 OPTIONAL 解释同【可以】,只是这里是形容词。

因为中文汉字没有大小写的说法,为了将这些关键字和其它文本做出区分, 会为每个关键字包裹一个 类名为 zh-upper 的样式,将其放大1.1倍,例如 必须 。 其 CSS 代码如下:

/* 中文大写 */ .zh-upper { display: inline-block; transform: scale(1.1); }

§ 14 术语表 中介绍了很多术语,为了保证术语的准确意义, 这些术语本身仍然使用英文,但是在文档的主要内容部分, 为了保证中文内容的完整性,会将这些术语进行翻译。但是不要担心找不到术语, 因为内容中的中文术语都会链接到 § 14 术语表 对应的英文术语上,例如: 用户代理

有些英文组合词语的翻译可能难以理解或者难以翻译, 或者说知道它的英文原词的表述可能更易于理解规范内容想要表达的意思, 本中文文档会使用小括号将英文原词显示出来以便学习理解,例如: 位字段(bit-field)、 基本权利要求(Essential Claim(s)) 等。

有些引用其它规范的,或文档的外部链接的,或者在 References 中说明了的链接不会进行翻译,这些通常都是与前端开发相关规范内容, 例如 stopPropagation()[HTML][DOM] 等。

最后,如果有些翻译内容表明了本部分文本不是规范的, 或者说本部分只是解释性的补充,请确定它们不是英文原档, 而是本节定义的内容补充,并且这些补充不一定保证完全正确,只用于帮助理解。

2.1.2. 文本样式

中文是没有空格的,字符和字符之间挨着,通过标点符号将一句话分隔以便理解。 但是英文是由单词组成的,每个单词之间通过空格分隔, 最后再用标点符号进行语义区分。由于英文空格的存在, 在英文内容源码换行时, 会自动将新开行的首个单词和上一行的尾部单词之间的回车符号作为空格渲染, 如果中文文本使用同样的规则,会导致在浏览器渲染的最终结果上, 汉字之间有不可避免的空格,这不符合阅读习惯。 为了保证中文的显示效果没有割裂感, 中文源码内容遵循以下在翻译实践中探寻出的规则:

2.1.3. 内容补充

为了辅助理解,有些地方会使用注释,例子,或者图像进行解释说明。 这其中包括英文原档的注释,例子,和图像。有些地方为了解释的更清楚, 或者翻译上有一些问题,会添加自定义的注释,例子或图像。 为了与原本区分开来,它们不会占用例子和图像的数量, 并且能自定义标题以突出区分,如下

这是一条非规范默认注释。

这是一条非规范自定义标题注释。

这是一个默认标题的非规范例子。

这是一个自定义标题的非规范例子。

这是一个默认标题的非规范图像
这是一个默认标题的非规范图像
自定义标题: 这是一个自定义标题的非规范图像
这是一个自定义标题的非规范图像

3. DOM 事件结构

本节内容并不是规范的。有关 DOM 事件结构的规范性描述,请参阅 [DOM]

3.1. 事件派发和 DOM 事件流

本节简要概述了事件 派发 机制, 并描述了事件如何通过 DOM 树传播。应用程序可以使用 dispatchEvent() 方法派发事件对象,事件对象将根据 DOM 事件流在 DOM 树上传播。

汉化图
原图
依据DOM 事件流机制,在 DOM 树中进行一次事件派发的图形化表示
依据DOM 事件流机制,在 DOM 树中进行一次事件派发的图形化表示
依据DOM 事件流机制,在 DOM 树中进行一次事件派发的图形化表示
依据DOM 事件流机制,在 DOM 树中进行一次事件派发的图形化表示

事件对象被分派到 事件目标 。 但在开始派发之前,事件对象的 传播路径 必须被首先确定。

传播路径 是事件经过的 当前事件目标 的有序列表。 此传播路径反映了文档树的层次结构。这个有序列表的最后一项是 事件目标 ,紧挨着事件目标的前面的一项是 目标的父亲节点(target’s parent) ,而(不包括事件目标的) 前面的所有项被称为 目标的祖先节点(target’s ancestors)

一旦确定了 传播路径 , 事件对象就会经过一个或多个 事件阶段 。 一般会包含三个事件阶段:捕获阶段目标阶段冒泡阶段。 每个事件对象都会像下面描述地那样经历完这些阶段,如果不支持某个阶段, 或者事件对象的传播被停止,则该阶段将被跳过。例如,如果 bubbles 属性被设置为 false , 事件对象就将跳过冒泡阶段,如果在派发之前调用了 stopPropagation() ,则将跳过所有阶段。

3.2. 默认行为和可取消事件

事件通常作为用户操作的结果,由实现(浏览器等用户代理)派发, 以响应(用户)活动的完成,或响应在异步活动(如网络请求)期间的进度信号 (signal progress)。这些都是在事件发生后,实现接下来可能采取的行为。 一些事件可被用于控制这些行为(或撤消实现已经采取的操作)。这类事件被认为是 可以取消的(cancelable) ,并且这种可以被取消的行为称为事件的 默认行为 。 可取消的事件对象可以与一个或多个"默认行为"相关联。要取消一个事件,请调用 preventDefault() 方法。

用户按下定位设备(通常是鼠标)上的按键后,会立即派发 mousedown 事件。 实现所采取的一个可能的 默认行为 是建立一个状态机(state machine),以允许用户拖动图像或选择文本。 默认行为 取决于接下来会发生什么——例如,如果用户的定位设备在文本上,则可能会开始文本选择; 如果用户的定位设备在图像上,则可以开始图像拖动操作。 阻止 mousedown 事件的 默认行为 将阻止这些操作的发生。

默认行为 通常在事件派发完成后执行, 但在特殊情况下,也可能在事件派发之前立即执行。

<input type="checkbox"> 元素上的 click 事件相关联的默认行为是切换(toggles)该元素的 checked IDL 属性值。如果 click 事件的默认操作被取消, 则该值将恢复到以前的状态。

当一个事件被取消时,与该事件相关联的有条件的(conditional) 默认行为 将被跳过(或者如上所述, 如果 默认行为 在派发之前执行, 则其作用将被撤消)。一个事件对象是否可取消由 cancelable 属性指示。调用 preventDefault() 方法将取消事件对象相关的所有 默认行为defaultPrevented 属性表示事件是否已经被取消(例如,由先前的事件侦听器取消)。如果 DOM 应用程序 本身发起了派发操作,那么 dispatchEvent() 方法的返回值能表示事件对象是否被成功取消。

许多实现还将 事件监听器 的返回值(如值 false )解释为可取消事件的 默认行为 将被被取消 (尽管 window.onerror 的处理程序通过返回 true 来取消)。

3.3. 同步和异步事件

事件可以被同步派发,也可以被异步派发。

同步的事件( 同步事件(sync events) ) 就好像它们在先进先出模型的虚拟队列中,按照事件在时间上的派发顺序进行排序, 这种事时间上的发生顺序基于其他事件、 DOM 中的变化和用户交互。 此虚拟队列中的每个事件都会延迟(派发),直到上一个事件的传播行为完成或被取消。 某些同步事件是由特定的设备或进程驱动的,例如鼠标按键事件。 这些事件由为该组事件定义的 事件顺序 算法控制,用户代理将按算法定义的顺序派发这些事件。

异步的事件( 异步事件(async events) ) 可以在操作结果完成时进行派发,与其他事件、 DOM 中的其他更改或用户交互无关。

在加载文档的过程中,会解析并执行内联脚本元素。 load 事件在脚本元素处排队,等待被异步派发。然而,因为它是一个异步事件, 所以 load 事件相对于文档加载期间派发的其他同步事件 (例如 [HTML5] 中的 DOMContentLoaded 事件)的顺序是不可保证的。

3.4. 可信事件

用户代理 生成的事件,无论是用户交互的结果, 还是DOM更改的直接结果,都受到 用户代理 的信任, 并拥有用户代理给予的特殊权限(privileges),而脚本代码通过 createEvent() 方法生成、使用 initEvent() 方法修改、 经过 dispatchEvent() 方法派发的事件不具有这种特殊权限 (即不受 用户代理 的信任)。受信任事件(可信事件)的 isTrusted 属性的值为 true ,而不受信任的事件的 isTrusted 属性值为 false

click 事件外,大多数不受信任的事件不会触发 默认行为click 事件始终触发 默认行为 ,即使它的 isTrusted 属性为 false (为了向后兼容,保留此行为)。 所有其他不受信任的事件表现地就好像在该事件上调用了 preventDefault() 方法一样。

3.5. 激活触发器和行为

某些 事件目标 (例如链接或按钮元素) 可能具有相关联的 激活行为 (例如跟随链接),这些行为是实现为了响应 激活触发器 (例如点击链接)而执行的。

HTML 和 SVG 都有一个 <a> 元素,它表示一个链接。 <a> 元素的相关 激活触发器<a> 元素的文本或图像内容上的 click 事件,或者当 <a> 元素聚焦时,激活触发器 也可以是 key 属性值为 "Enter" 键的 keydown 事件。 <a> 元素的激活行为通常是: 在链接是外部链接的情况下, 将窗口的内容更改为链接的新文档的内容,或者在链接是内部链接的情况下, 将当前文档相对于新锚点重新定位。

激活触发器 是一个用户操作或一个事件, 它会向实现指示激活行为应该被启动了。 用户发起的 激活触发器 包括: 在可激活元素上单击鼠标按键,当焦点在可激活元素上时按下 Enter 键,或者即使可激活元素不是焦点,按下可以以某种方式链接到可激活元素的键 ( 热键快捷键 )。基于事件的 激活触发器 可以包括: 基于定时器的,在特定时钟时间或在经过特定时间段之后激活元素的事件、 在完成特定动作之后的进度事件、或许多基于条件或基于状态的其他事件。

3.6. 构造鼠标和键盘事件

通常,当调用 Event 接口或从 Event 接口继承的接口的构造函数时, 应遵循 [DOM] 中描述的步骤。然而, KeyboardEventMouseEvent 接口提供了额外的字典成员,用于初始化 Event 对象的键修饰符的内部状态: 特别地,这些键修饰符可以使用 getModifierState()getModifierState() 方法查询内部状态。 本节补充了使用这些可选的修饰符状态初始化一个新的 Event 对象的 DOM4 步骤。

KeyboardEventMouseEvent 都继承于 UIEvent 接口, 但是它们的构造函数的可选的,用于初始化事件对象的字典并非直接继承于 UIEventInitKeyboardEventInitMouseEventInit 字典都继承于 EventModifierInit ,这个字典定义了很多键盘修饰符属性, 用于表示键盘按键的状态。同时 EventModifierInit 是继承于 UIEventInit 的。

为了使用下面的算法构建 KeyboardEventMouseEvent 或从这些对象派生的对象,所有 KeyboardEventMouseEvent 和派生对象都具有 内部键修饰符状态 , 可以使用 [UIEvents-Key] 规范中, 修饰符键表 中描述的键修饰符名称 来设置和检索该状态。

以下步骤补充了定义在 DOM4 中构建事件时的算法:

4. 基本事件接口

[DOM] 中定义的基本事件接口是用户界面事件的基础。 这些基本事件接口 必须 始终在实现中的得到支持:

本规范中定义的事件类型派生自这些基本接口,并且派生自的这些接口的用户事件接口 必须 继承它们的所有属性、方法和常量。

下图描述了本规范中描述的接口的继承结构。

汉化图
原图
本规范定义的接口的继承结构的图形表示
本规范定义的接口的继承结构的图形表示
本规范定义的接口的继承结构的图形表示
本规范定义的接口的继承结构的图形表示

4.1. 事件类型列表

每个事件 必须 与一个类型相关联,该类型称为 事件类型 ,并被用作事件对象的 type 属性。事件类型 必须DOMString 类型。

依据 DOM 支持的级别,或依据用于显示(例如,屏幕)或交互 (例如,鼠标、键盘、触摸屏或语音)的设备,这些事件类型可以由实现决定和生成。 当在 [XML][HTML5] 应用程序使用(事件类型)时,这些语言的规范 可以 限制与事件类型相关的语义和范围 (特别是在适合的 事件目标 上)。 请参阅有关定义所用语言的规范文档, 以查找这些限制或查找本文档中未定义的事件类型。

下表提供了本规范中描述的事件类型的信息摘要。

事件类型 同步 / 异步 冒泡阶段 可信事件目标类型 DOM 接口 可取消默认行为 默认行为
abort 同步 不冒泡 Window, Element Event 不能 没有
auxclick 同步 冒泡 Element PointerEvent 多种
beforeinput 同步 冒泡 Element InputEvent 更新 DOM 元素
blur 同步 不冒泡 Window, Element FocusEvent 不能 没有
click 同步 冒泡 Element PointerEvent 多种: 有相关激活行为的 目标 执行其 激活行为 ; 可聚焦的 目标 ,给予目标元素焦点。
compositionstart 同步 冒泡 Element CompositionEvent 显示 文本合成系统 候选窗口
compositionupdate 同步 冒泡 Element CompositionEvent 不能 没有
compositionend 同步 冒泡 Element CompositionEvent 不能 没有
contextmenu 同步 冒泡 Element PointerEvent 调用出上下文菜单(如果支持)
dblclick 同步 冒泡 Element MouseEvent 不能 多种: 有相关激活行为的 目标 执行其 激活行为 ;可聚焦的 目标 ,给予目标元素焦点;
error 异步 不冒泡 Window, Element Event 不能 没有
focus 同步 不冒泡 Window, Element FocusEvent 不能 没有
focusin 同步 冒泡 Window, Element FocusEvent 不能 没有
focusout 同步 冒泡 Window, Element FocusEvent 不能 没有
input 同步 冒泡 Element InputEvent 不能 没有
keydown 同步 冒泡 Element KeyboardEvent 多种: 激发(trigger) beforeinputinput 事件; 启动 文本合成系统 ; 可能触发 blurfocus 事件; 触发 keypress 事件(如果支持); 可能执行 目标激活行为 ; 可能触发其它事件
keyup 同步 冒泡 Element KeyboardEvent 没有
load 异步 不冒泡 Window, Document, Element Event 不能 没有
mousedown 同步 冒泡 Element MouseEvent 多种: 开始一个拖放操作; 开始一次文本选择; 开始一个滚动 / 移动交互 (如果支持鼠标,则会与鼠标中键联合使用)
mouseenter 同步 不冒泡 Element MouseEvent 不能 没有
mouseleave 同步 不冒泡 Element MouseEvent 不能 没有
mousemove 同步 冒泡 Element MouseEvent 没有
mouseout 同步 冒泡 Element MouseEvent 没有
mouseover 同步 冒泡 Element MouseEvent 没有
mouseup 同步 冒泡 Element MouseEvent 没有
select 同步 冒泡 Element Event 不能 没有
unload 同步 不冒泡 Window, Document, Element Event 不能 没有
wheel 异步 冒泡 Element WheelEvent 滚动(或缩放)文档

有关本规范中不推荐使用的事件的列表,请参阅本文档末尾的 遗留事件类型 附录。

以下是对上表进行解释的一种方式: load 事件将在该事件的捕获和目标阶段上触发(trigger)附加于 Element 节点的 事件监听器 。此事件不可取消。 如果 load 事件的 事件监听器 附加到除了 WindowDocument , 或 Element 以外的节点,或者仅附加到冒泡阶段,则不会(在被监听事件目标上)触发此 事件监听器

不要将上表解释为最权威的(definitive)事件类型列表。 例如, load 事件也用于其他规范中,例如 XMLHttpRequest 中。类似地, 对于 任何 实现了 EventTarget 接口的对象, 可以调用对象的 dispatchEvent() 方法将不受信任的事件派发给它的侦听器。

与上述事件类型相关联的事件对象包含额外的上下文信息——请参阅 DOM 接口的描述获取更多信息。

5. 事件类型

DOM 事件模型允许 DOM 实现支持多个事件模块。 该模型的设计允许将来添加新的事件模块(可扩展)。本文档没有试图定义所有可能的事件。 为了实现互操作性(interoperability), DOM 定义了一个用户界面事件模块(包括较低级别的设备独立事件)和一个文档变化事件 (document mutation events)模块。

5.1. 用户界面事件

用户界面事件模块包含与用户界面和文档操作相关联的基本事件类型。

5.1.1. UIEvent 接口

在 DOM Level 2中引入介绍

UIEvent 接口提供了与用户界面事件相关的特定上下文信息。

要创建 UIEvent 接口的实例,使用UIEvent构造函数, 传递一个可选的 UIEventInit 字典。

对于新定义的事件,你不必继承 UIEvent 接口,因为它们与用户界面相关。 只有当 UIEventInit 的成员对那些事件有意义时才继承。

5.1.1.1. UIEvent
[Exposed=Window]
interface UIEvent : Event {
  constructor(DOMString type, optional UIEventInit eventInitDict = {});
  readonly attribute Window? view;
  readonly attribute long detail;
};
UIEvent . view
view 属性标识生成事件的窗口 Window

该属性的 未初始化值 必须null

UIEvent . detail
指定有关 Event 的一些详细信息,具体取决于事件的类型。

该属性的 未初始化值 必须0

UIEvent.detail ,只读属性,返回一个数字,当值为非零时, 根据具体的事件类型返回点击次数:
① 对于 clickdblclick 事件 ,UIEvent.detail 返回当前点击数;
② 对于 mousedownmouseup 事件 , UIEvent.detail1 加上当前点击数;
③ 对于其它 UIEvent 事件,UIEvent.detail 一直是 0

5.1.1.2. UIEventInit
dictionary UIEventInit : EventInit {
  Window? view = null;
  long detail = 0;
};
UIEventInit . view
应初始化为全局环境的Window对象,该事件将在这个Window对象中派发。 如果这个事件将被派发到一个元素,view属性应该设置为包含改元素的 ownerDocument 的Window对象。
UIEventInit . detail
此属性的初始化值为数字,取决于应用程序(application-specific)。

5.1.2. 用户界面事件类型

用户界面事件类型列表如下所示。如果事件从用户界面生成, 那么这些些事件使用 UIEvent 接口实现, 否则使用 Event 接口实现,详见每个事件。

5.1.2.1. load
类型 load
接口 事件从用户界面生成就是 UIEvent,否则是 Event
同步 / 异步 异步
冒泡
可信目标对象 Window, Document, Element
可取消默认行为
默认行为 没有
上下文
(可信事件)

当DOM实现(DOM implementation)完成对资源(如文档)和所有的依赖资源 (如图像,样式表或脚本)的加载后, 用户代理 必须派发这个 load 事件。 如果加载依赖资源的元素(如<link>,<script>) 仍然可以通过DOM访问,那么加载失败的依赖资源 绝对不能 阻止此事件的触发。 派发此事件的事件对象 被要求 至少是在 Document 节点上。

由于遗留的原因,在HTML实现的传播路径(事件流)中, 文档内资源(例如,图像)的 load 事件不包括 Window 。 更多信息请参见[HTML5]

5.1.2.2. unload
类型 unload
接口 事件从用户界面生成就是 UIEvent,否则是 Event
同步 / 异步 同步
冒泡
可信目标对象 Window, Document, Element
可取消默认行为
默认行为 没有
上下文
(可信事件)

当用户代理从环境中移除资源(如文档)或任何依赖资源(如图像,样式表,脚本)时, 用户代理 必须 派发 unload 事件。 DOM文档在派发 unload 事件后 必须 被卸载(unloaded)。 和 load 事件一样,派发此事件的事件对象 被要求 至少是 Document 节点。

5.1.2.3. abort
类型 abort
接口 由用户界面产生就是 UIEvent ,否则为 Event
同步 / 异步 同步
冒泡
可信目标对象 Window, Element
可取消默认行为
默认行为 没有
上下文
(可信事件)

当资源的加载被中止时,例如用户在加载仍在进行时取消加载, 用户代理 必须 派发此事件。

5.1.2.4. error
类型 error
接口 由用户界面产生就是 UIEvent ,否则为 Event
同步 / 异步 异步
冒泡
可信目标对象 Window, Element
可取消默认行为 不能
默认行为 没有
上下文
(可信事件)

当资源加载失败或已加载但无法根据其语义进行解释时, 例如无效图像、脚本执行错误或格式不正确的XML, 用户代理 必须 派发 error 事件。

5.1.2.5. select
类型 select
接口 由用户界面产生就是 UIEvent ,否则为 Event
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为 不能
默认行为 没有
上下文
(可信事件)

当用户选择某些文本时, 用户代理 必须调度此事件。此事件是在选择发生后发出的。

本规范不提供访问所选文本的上下文信息。在应用此事件的情况下, 宿主语言 定义用户 可以 如何选择内容(考虑国际语言惯例)、 在什么时候派发 select 事件以及内容作者 可以 如何访问用户选择的内容的规则。

为了访问用户选择的内容,内容作者将使用 宿主语言 的本地功能, 例如HTML Editing API [Editing]Document.getSelection() 方法。

select 事件可能不适用于所有语言的所有元素。 例如,在 [HTML5] 中, select 事件只能在表单 inputtextarea 元素上派发。 实现可以在任何被认为合适的上下文中派发 select, 包括表单控件之外的文本选择,或者SVG中的图像或标记选择。

5.2. 焦点事件

该接口及其关联的事件类型和 § 5.2.2 焦点事件顺序 是根据 用户代理可访问性指南2.0 [UAAG20] 中定义的概念和指南设计的,需要特别关注 焦点机制 焦点术语表条目 中定义的术语。

5.2.1. FocusEvent 接口

在本规范中引入介绍

FocusEvent 接口提供了与Focus事件相关的特定上下文信息。

要创建 FocusEvent 接口的实例,使用 FocusEvent 构造函数,传递一个可选的 FocusEventInit 字典。

5.2.1.1. FocusEvent
[Exposed=Window]
interface FocusEvent : UIEvent {
  constructor(DOMString type, optional FocusEventInit eventInitDict = {});
  readonly attribute EventTarget? relatedTarget;
};
FocusEvent . relatedTarget
用于标识与Focus事件相关的次要 EventTarget,具体取决于事件的类型。

出于嵌套浏览上下文的安全考虑,当进入或退出嵌套上下文时, 相关的 EventTarget 应当null

此属性的 未初始化值 必须null

5.2.1.2. FocusEventInit
dictionary FocusEventInit : UIEventInit {
  EventTarget? relatedTarget = null;
};
FocusEventInit . relatedTarget
应该将 relatedTarget 初始化为失去焦点的元素 (在 focusfocusin 事件的情况下)或获得焦点的元素 (在 blurfocusout事件的情况下)。

5.2.2. 焦点事件顺序

本规范中定义的焦点事件以相对于另一个焦点事件的固定顺序发生。 以下是焦点在元素之间转移时的典型事件序列(此顺序假设最初没有元素被聚焦):

事件类型 注释
用户转移焦点
1 focus 在第一个目标元素接收焦点之后发送
2 focusin 紧随 focus 事件发送
用户转移焦点
3 blur 在第一个目标元素失去焦点之后发送
4 focusout 紧随 blur 事件发送
5 focus 在第二个目标元素接收焦点后发送
6 focusin 紧随 focus 事件发送

该规范没有定义焦点事件在与 focus()blur() 等方法交互时的行为。请参阅相关规范,其中为此类行为定义了这些方法。

5.2.3. 文档焦点和焦点上下文

此事件模块包括用于通知文档 焦点 发生变更的事件类型。 有三个不同的焦点上下文与这个讨论相关:

本规范中定义的事件类型专门处理文档焦点(而不是操作系统焦点和应用程序焦点), 在事件详细信息中标识的 事件目标 必须 只能是文档或窗口中的文档的一部分, 而不能是浏览器或操作系统的一部分, 即使是从一个焦点上下文切换到另一个焦点上下文时也是如此。

通常,文档总是有一个焦点元素(即使它本身就是文档元素)和一个持久的 焦点环 。在焦点上下文之间切换时, 文档的当前焦点元素和焦点环通常保持当前状态。例如, 如果一个文档有三个可聚焦的元素,其中第二个元素是聚焦的, 当用户将操作系统焦点更改为另一个应用程序,然后再更改为浏览器时, 第二个元素仍将在文档中聚焦,而选项卡将把焦点更改为第三个元素。 宿主语言 可以 定义可以接收焦点的特定元素、元素 可以 接收焦点的条件、 可以 改变焦点的方式 以及焦点改变(发生事件)的顺序。例如,在某些情况下, 可以通过将指针移到元素上来获得焦点,而在其他情况下可能需要单击鼠标。 有些元素可能根本无法成为焦点,有些元素可能只能通过特殊方式 (单击元素) 变成可聚焦的元素,但不能通过按下 tab 键聚焦它。 文档 可以 包含多个焦点环。 其他规范 可以 定义比本规范中描述的更复杂的焦点模型,包括允许多个元素具有当前焦点。

5.2.4. 焦点事件类型

下面列出了焦点事件类型。

5.2.4.1. blur
类型 blur
接口 FocusEvent
同步 / 异步 同步
冒泡
可信目标对象 Window, Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

事件目标 失去焦点后, 用户代理 必须 派发此事件。在派发此事件之前,元素(失去焦点的事件目标) 必须 被取下焦点。此类型类似于 focusout ,并且会发生冒泡。

5.2.4.2. focus
类型 focus
接口 FocusEvent
同步 / 异步 同步
冒泡
可信目标对象 Window, Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

事件目标 接收焦点后, 用户代理必须 派发此事件。在派发此事件之前, 必须 将焦点放在元素(接收焦点的事件目标)上。此事件类型类似于 focusin ,并且不会发生冒泡。

5.2.4.3. focusin
类型 focusin
接口 FocusEvent
同步 / 异步 同步
冒泡
可信目标对象 Window, Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

事件目标 接收焦点后, 用户代理 必须 派发此事件。事件目标 必须 是即将接收焦点的元素。focus 事件 必须 在此事件类型派发前发送。 此事件类型类似于 focus ,并且发生冒泡。

5.2.4.4. focusout
类型 focusout
接口 FocusEvent
同步 / 异步 同步
冒泡
可信目标对象 Window, Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

事件目标 失去焦点后, 用户代理 必须 派发此事件。事件目标 必须 是即将失去焦点的元素。 blur 事件 必须 在此事件类型派发前发送。 此事件类型类似于 blur ,并且发生冒泡。

5.3. 鼠标事件

鼠标事件模块来源于 [HTML401] 定义的onclick, ondblclick, onmousedown, onmouseup, onmouseover, onmousemove, 和 onmouseout 属性。鼠标事件模块专门为指向输入设备 (pointing input devices)设计使用(designed for use),例如鼠标或轨迹球。

5.3.1. MouseEvent 接口

在DOM Level 2中引入介绍,并在本规范修改调整

MouseEvent 接口提供了与鼠标事件相关的特定上下文信息

在有嵌套元素的场景下,鼠标事件总是把嵌套最深的元素作为目标。

目标元素的祖先可以利用事件冒泡来获取其派生元素中发生的鼠标事件的通知。

要创建 MouseEvent 接口的实例,请使用 MouseEvent 构造函数, 它接收一个可选的 MouseEventInit 字典作为初始化事件的参数。

当使用 initMouseEvent 初始化 MouseEvent 对象时, (浏览器)实现可以使用客户端坐标 clientXclientY 来计算其他坐标(例如 DOM Level 0 实现公开了目标坐标或其他私有属性, 见于 pageX pageY 等)。

5.3.1.1. MouseEvent
[Exposed=Window]
interface MouseEvent : UIEvent {
  constructor(DOMString type, optional MouseEventInit eventInitDict = {});
  readonly attribute long screenX;
  readonly attribute long screenY;
  readonly attribute long clientX;
  readonly attribute long clientY;
  readonly attribute long layerX;
  readonly attribute long layerY;

  readonly attribute boolean ctrlKey;
  readonly attribute boolean shiftKey;
  readonly attribute boolean altKey;
  readonly attribute boolean metaKey;

  readonly attribute short button;
  readonly attribute unsigned short buttons;

  readonly attribute EventTarget? relatedTarget;

  boolean getModifierState(DOMString keyArg);
};
screenX, of type long, readonly
screenXlong 类型(4字节整型),只读
事件发生时相对于屏幕坐标系原点的水平坐标。

该属性的 未初始化值 必须0

screenY, of type long, readonly
screenYlong 类型(4字节整型),只读
事件发生时相对于屏幕坐标系原点的竖直坐标。

该属性的 未初始化值 必须0

clientX, of type long, readonly
clientXlong 类型(4字节整型),只读
提供了发生事件的位置在应用程序视口中的水平坐标(而不是可能滚动的页面的坐标)。

该属性的 未初始化值 必须0

clientY, of type long, readonly
clientYlong 类型(4字节整型),只读
提供了发生事件的位置在应用程序视口中的竖直坐标(而不是可能滚动的页面的坐标)。

该属性的 未初始化值 必须0

layerX, of type long, readonly
layerXlong 类型(4字节整型),只读
距离最近的 祖先 元素的水平偏移量,该 祖先 元素是 层叠上下文(stacking context)确定位置的盒(positioned box) , 或者是 绘制层叠上下文(painting a stacking context) 时, 在定位阶段的绘制结果。

该属性的 未初始化值 必须0

layerY, of type long, readonly
layerYlong 类型(4字节整型),只读
距离最近的 祖先 元素的垂直偏移量,该 祖先 元素是 层叠上下文(stacking context)确定位置的盒(positioned box) , 或者是 绘制层叠上下文(painting a stacking context) 时, 在定位阶段的绘制结果。

该属性的 未初始化值 必须0

ctrlKey, of type boolean, readonly
ctrlKeyboolean 类型,只读
请参阅 KeyboardEventctrlKey 属性。

ctrlKey 属性提供了当触发的鼠标事件发生时, ctrl 键修饰符是否活跃的状态

该属性的 未初始化值 必须false
shiftKey, of type boolean, readonly
shiftKeyboolean 类型,只读
请参阅 KeyboardEventshiftKey 属性。

shiftKey 属性提供了当触发的鼠标事件发生时, ctrl 键修饰符是否活跃的状态

该属性的 未初始化值 必须false

altKey, of type boolean, readonly
altKeyboolean 类型,只读
请参阅 KeyboardEventaltKey 属性。

altKey 属性提供了当触发的鼠标事件发生时, ctrl 键修饰符是否活跃的状态

该属性的 未初始化值 必须false

metaKey, of type boolean, readonly
metaKeyboolean 类型,只读
请参阅 KeyboardEventmetaKey 属性。

metaKey 属性提供了当触发的鼠标事件发生时, ctrl 键修饰符是否活跃的状态

该属性的 未初始化值 必须false

button, of type short, readonly
buttonshort 类型(2字节整型),只读
在按下或释放鼠标按钮引起的鼠标事件中, 必须 使用 button 来指示指针设备的哪个按键改变了状态。

button 属性的值 必须 如下所示:

  • 0 必须 表示设备的主按键 (一般而言是左按键或单按键设备上的唯一按键,用于激活用户界面控件或选择文本) 或 表示未初始化的值。

  • 1 必须 表示设备的辅助(auxiliary)按键 (一般而言是中间按键,并与鼠标滚轮组合)。

  • 2 必须 表示设备的次(secondary)按键 (一般而言是右按键,通常用于显示一个上下文菜单)。

  • 3 必须 表示设备的X1(后退)按键 (第4按键,常用于浏览器后退按键)。

  • 4 必须 表示设备的X2(前进)按键 (第5按键,常用于浏览器前进按键)

一些定位设备提供或模拟更多的按键状态,并且 可以 使用高于 2 或低于 0 的值来表示这样的按键状态。

对于不是由按下/释放鼠标按键引起的事件, button 的值不会更新。 在这些场景中,请注意不要将值 0 解释为左按键的激活状态,而是将其解释为 未初始化值

一些与 mousedownmouseup 等事件相关的 默认操作 取决于触发事件的特定鼠标按键。

该属性的 未初始化值 必须0

buttons, of type unsigned short, readonly
buttonsunsigned short 类型(无符号2字节整型),只读
在任何鼠标事件触发期间, 必须 使用 buttons 来指示当前设备正被按下的鼠标按键组合,以位掩码表示。

虽然名称相似,但 buttons 属性和 button 属性的值非常不同。 在 mousedown / mouseup 事件处理程序中, button 的值被认为是有效的,而 buttons 属性反映了任何可信的 MouseEvent 对象(在事件被派发时)的鼠标按键的状态,因此它能表示 "当前没有活动的按键"这一状态(buttons 属性值为 0 时)。

buttons 属性的值 必须 是如下所示 (组成的位掩码):

  • 0 必须 表示当前没有按键被激活

    按键激活就是按键处于按下状态,下同理

  • 1 必须 表示设备的主按键处于激活状态 (一般而言,设备的主按键是左按键或单按键设备上的唯一按键,用于激活用户界面控件或选择文本)。

  • 2 必须 表示次按键(如果存在)处于激活状态 (一般而言,设备的次按键是右按键,通常用于显示一个上下文菜单)。

  • 4 必须 表示辅助按键处于激活状态 (一般而言是中间按键,并与鼠标滚轮组合)。

一些定位设备能提供或模拟更多按键。为了表示这些按键,每个连续按钮的值 必须 增长一倍(也就是在二进制序列 81632 ,...)。

因为任何一组按键值的总和(与操作)都是一个唯一的数字, 所以对于一个拥有任意数量的鼠标按键的设备而言, 开发者可以使用逐位(遍历)操作来确定当前被按下的按钮数量, 以及它们是哪些按键。例如,值 3 表示当前同时按下了左按键和右按键,而值 5 表示当前同时按住了左按键和中间按键。

一些与 mousedownmouseup 等事件相关的 默认操作 取决于使用中的特定鼠标按键。

该属性的 未初始化值 必须0

relatedTarget, of type EventTarget, readonly, nullable
relatedTargetEventTarget 类型,只读,可空
用于标识与 UI 事件相关的次要 EventTarget,具体值取决于事件的类型。

该属性的 未初始化值 必须null

getModifierState(keyArg)

(该方法)在本规范中引入介绍

使用键值查询(键盘按键)修饰符的状态。

如果它(传入的 keyArg )是一个 (键盘) 修饰符键并且对应的按键被激活, 则返回 true ,否则返回 false

DOMString keyArg
有关此参数的描述,请参阅 KeyboardEventgetModifierState() 方法。
5.3.1.2. MouseEventInit
dictionary MouseEventInit : EventModifierInit {
  long screenX = 0;
  long screenY = 0;
  long clientX = 0;
  long clientY = 0;

  short button = 0;
  unsigned short buttons = 0;
  EventTarget? relatedTarget = null;
};
screenX, of type long, defaulting to 0
screenXlong 类型(4字节整型), 默认值为 0
MouseEvent 对象的 screenX 属性初始化为鼠标指针在用户屏幕上期望的水平相对位置。

将事件对象的 screenX 属性初始化为给定的鼠标位置时, 不得将用户的鼠标指针移动到初始化位置。

screenY, of type long, defaulting to 0
screenXlong 类型(4字节整型), 默认值为 0
MouseEvent 对象的 screenY 属性初始化为鼠标指针在用户屏幕上期望的竖直相对位置。

将事件对象的 screenY 属性初始化为给定的鼠标位置时, 不得将用户的鼠标指针移动到初始化位置。

clientX, of type long, defaulting to 0
clientXlong 类型(4字节整型), 默认值为 0
MouseEvent 对象的 clientX 属性初始化为鼠标指针相对于用户浏览器的客户端窗口(视口)期望的水平位置。

将事件对象的 clientX 属性初始化为给定的鼠标位置时, 不得将用户的鼠标指针移动到初始化位置。

clientY, of type long, defaulting to 0
clientYlong 类型(4字节整型), 默认值为 0
MouseEvent 对象的 clientY 属性初始化为鼠标指针相对于用户浏览器的客户端窗口(视口)期望的竖直位置。

将事件对象的 clientY 属性初始化为给定的鼠标位置时, 不得将用户的鼠标指针移动到初始化位置。

button, of type short, defaulting to 0
buttonshort 类型(2字节整型), 默认值为 0
MouseEvent 对象的 button 属性初始化为一个数字,这个数字表示鼠标按键期望的状态。

值 0 用于表示鼠标主按键,值 1 用于表示辅助按键/鼠标中键,值 2 用于表示鼠标右键。大于 2 的数字也是可能的,但在本文档中没有指定规范。

buttons, of type unsigned short, defaulting to 0
buttonsunsigned short 类型(无符号2字节整型), 默认值为 0
MouseEvent 对象的 buttons 属性初始化为一个数字, 该数字表示鼠标的一个 或多个 按键处于激活状态。

buttons 属性是一个位字段(bit-field)。 如果将掩码值 1 和位字段的值(也就是 buttons 属性值)进行与操作结果为 true (或者说是 1 ), 则表示(事件触发时)鼠标左键(主按键)是按下状态。如果将掩码值 4 和位字段的值(也就是 buttons 属性值)进行与操作结果为 true (或者说是 1 ),则表示(事件触发时)鼠标辅助按键 / 中间按键是按下状态。

在JavaScript中,要初始化 buttons 属性, 例如想要设置右键(2)和中键(4)同时被按下的状态,可以将buttons的值分配为:
  { buttons: 2 | 4 }
或者:
  { buttons: 6 }

relatedTarget, of type EventTarget, nullable, defaulting to null
relatedTargetEventTarget 类型, 默认值为 null
relatedTarget 应该初始化为鼠标指针刚刚离开其边界的元素 (在发生 mouseovermouseenter 事件的情况下) 或鼠标指针正在进入其边界的元素(在发生 mouseoutmouseleavefocusout 事件的情况下)。对于其他事件,不需要分配此值(并设为默认值 null )。

在生成鼠标事件时,实现 必须 维护 当前的点击次数 。这 必须 是一个非负整数,表示在特定时间内连续点击定位设备按键的次数。 计数重置之后的延迟是取决于环境配置。

这个点击次数使用 UIEvent 定义的 detail 属性保存。

5.3.2. 事件修饰符初始化器

MouseEventKeyboardEvent 接口共享一组键盘修饰符属性, 并支持检索附加修饰符状态的机制。以下字典使开发者能够初始化 MouseEventKeyboardEvent 接口的键盘修饰符属性, 以及通过 getModifierState() 查询附加键盘修饰符状态。使用此字典构造事件的步骤在 事件构造函数 部分中进行了定义。

dictionary EventModifierInit : UIEventInit {
  boolean ctrlKey = false;
  boolean shiftKey = false;
  boolean altKey = false;
  boolean metaKey = false;

  boolean modifierAltGraph = false;
  boolean modifierCapsLock = false;
  boolean modifierFn = false;
  boolean modifierFnLock = false;
  boolean modifierHyper = false;
  boolean modifierNumLock = false;
  boolean modifierScrollLock = false;
  boolean modifierSuper = false;
  boolean modifierSymbol = false;
  boolean modifierSymbolLock = false;
};
ctrlKey, of type boolean, defaulting to false
ctrlKeyboolean 类型, 默认值为 false
如果要将 Control 键修饰符视为活动状态, 则将 MouseEventKeyboardEvent 对象的 ctrlKey 属性初始化为 true,否则为 false

当为 true 时,实现还必须初始化事件对象的键修饰符状态, 以便在提供参数 Control 时,对 getModifierState()getModifierState() 的调用必须返回 true

shiftKey, of type boolean, defaulting to false
shiftKeyboolean 类型, 默认值为 false
如果要将 Shift 键修饰符视为活动状态, 则将 MouseEventKeyboardEvent 对象的 shiftKey 属性初始化为 true,否则为 false

当为 true 时,实现还必须初始化事件对象的键修饰符状态, 以便在提供参数 Shift 时,对 getModifierState()getModifierState() 的调用必须返回 true

altKey, of type boolean, defaulting to false
altKeyboolean 类型, 默认值为 false
如果要将 Alt (可替代)(或 Option )键修饰符视为活动状态, 则将 MouseEventKeyboardEvent 对象的 altKey 属性初始化为 true,否则为 false

当为 true 时,实现还必须初始化事件对象的键修饰符状态, 以便在提供参数 Alt 时,对 getModifierState()getModifierState() 的调用必须返回 true

metaKey, of type boolean, defaulting to false
metaKeyboolean 类型, 默认值为 false
如果要将 Meta 键修饰符视为活动状态, 则将 MouseEventKeyboardEvent 对象的 metaKey 属性初始化为 true,否则为 false

当为 true 时,实现还必须初始化事件对象的键修饰符状态, 以便在提供参数 Meta 时,对 getModifierState()getModifierState() 的调用必须返回 true

modifierAltGraph, of type boolean, defaulting to false
modifierAltGraphboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 AltGraph 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierCapsLock, of type boolean, defaulting to false
modifierCapsLockboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 CapsLock 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierFn, of type boolean, defaulting to false
modifierFnboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 Fn 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierFnLock, of type boolean, defaulting to false
modifierFnLockboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 FnLock 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierHyper, of type boolean, defaulting to false
modifierHyperboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 Hyper 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierNumLock, of type boolean, defaulting to false
modifierNumLockboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 NumLock 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierScrollLock, of type boolean, defaulting to false
modifierNumLockboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 NumLock 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierSuper, of type boolean, defaulting to false
modifierSuperboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 Super 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierSymbol, of type boolean, defaulting to false
modifierSymbolboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 Symbol 参数时,调用 getModifierState()getModifierState() 必须返回 true 。
modifierSymbolLock, of type boolean, defaulting to false
modifierSymbolLockboolean 类型, 默认值为 false
初始化事件对象的键修饰符状态,以便在提供 SymbolLock 参数时,调用 getModifierState()getModifierState() 必须返回 true 。

关于修饰符键的表示的具体键盘按键, 在不同的键盘设备和不同的操作系统上,甚至不同的浏览器上, 都会有不同的映射关系以及不同的修饰符键支持程度。 可以参阅 [UIEvents-Key] 中的 修饰符键值表格 获取非标准有效的修饰符键列表。也可以参阅 MDN-KeyboardEvent-getModifierState-modifier_keys_on_gecko 了解火狐浏览器内核支持的修饰符键。

5.3.3. 鼠标事件顺序

本规范中定义的某些鼠标事件 必须 按相对于彼此的固定顺序发生。 下面的内容显示了当定位设备的光标移动到元素上时 必须 发生的事件序列:

事件类型 元素 注释
1 mousemove
定位设备(的光标)移入元素A...
2 mouseover A
3 mouseenter A
4 mousemove A 有多个 mousemove 事件(被派发)
定位设备(的光标)移出元素A...
5 mouseout A
6 mouseleave A

当定位设备(的光标)移入元素 A ,然后移入嵌套元素 B ,然后再移出时, 必须 发生以下事件序列:

事件类型 元素 注释
1 mousemove
定位设备(的光标)移入元素A...
2 mouseover A
3 mouseenter A
4 mousemove A 有多个 mousemove 事件(被派发)
定位设备(的光标)移入 嵌套的元素B...
5 mouseout A
6 mouseover B
7 mouseenter B
8 mousemove B 有多个 mousemove 事件(被派发)
定位设备(的光标)从元素B 移入元素A...
9 mouseout B
10 mouseleave B
11 mouseover A
12 mousemove A 有多个 mousemove 事件(被派发)
定位设备(的光标)移出元素A...
13 mouseout A
14 mouseleave A

有时,使用 CSS 可以在视觉上重叠元素。 在以下示例中,标记为 A 、 B 和 C 的三个元素在网页上都具有相同的尺寸和绝对位置。 在DOM中,元素 C 是 B 的子元素,而元素 B 是 A 的子元素:

三个堆叠元素的图形表示,所有元素都重叠在一起。底部元素标记为 A ,顶部元素标记为 C
三个堆叠元素的图形表示,所有元素都重叠在一起,定位设备在堆叠上移动。

当定位设备从元素堆叠外部移入标记为 C 的元素,然后再次移出时, 必须 发生以下一系列事件:

事件类型 元素 注释
1 mousemove
定位设备移动到元素 C 中, 即堆叠中最顶层的元素
2 mouseover C
3 mouseenter A
4 mouseenter B
5 mouseenter C
6 mousemove C 有多个 mousemove 事件(被派发)
定位设备(的光标)移出元素 C...
7 mouseout C
8 mouseleave C
9 mouseleave B
10 mouseleave A

mouseover/mouseout 事件只触发一次,而 mouseenter/mouseleave 事件触发三次(每个元素一次)。

以下是在元素上按下和释放与定位设备相关联的按键 (例如,鼠标按键或触控板)时的典型事件序列:

事件类型 注释
1 mousedown
2 mousemove 可选 , 可以有0到多个,限制在点击的同一个元素内移动
3 mouseup
4 click
5 mousemove 可选 , 可以有0到多个,限制在点击的同一个元素内移动
6 mousedown
7 mousemove 可选 , 可以有0到多个,限制在点击的同一个元素内移动
8 mouseup
9 click
10 dblclick

允许在一对 mousedownmouseup 事件触发后,仍然派发 clickdblclick 事件(在mousedownmouseup 事件派发过程中)的延迟时间、程度、距离和 mousemove 事件的数量的具体限制或容忍度,将取决于实现、设备和平台。 这种容忍度有助于身体残疾的用户(浏览操作网页),比如, 有些手不稳的用户与定位设备交互时的场景。

(鼠标事件顺序的) 实现都会确定适当的 滞后 容限,但通常情况下,当关联的 mousedownmouseup 事件的事件目标是相同的元素且没有 mouseoutmouseleave 事件居于中间发生时,应该触发 clickdblclick 事件, 当关联的 mousedownmouseup 事件目标不同时, 应该在二者 (两个不同事件目标元素) 最近公共祖先上触发 clickdblclick 事件。

如果 mousedown 事件的事件目标是 HTML 文档的 body 元素,而相应的 mouseup 事件的事件目标是 根元素 ,那么 click 事件将在 根元素 上触发,因为它是最近的公共祖先节点。

如果在鼠标事件序列期间从 DOM 中删除了 事件目标 (例如,目标元素),则该序列中的其余事件 不得 在该元素上触发。

如果在 mousedown 事件触发的(事件处理程序中)从 DOM 中删除了目标元素, 则不会在该元素上派发 mouseupclickdblclick 事件,也不会派发任何默认激活事件。但是,在移除初始目标元素之后, mouseup 事件仍将在暴露给鼠标的元素上被派发。类似地,如果在 mouseup 事件的派发过程中从 DOM 中删除了目标元素,也不会派发 click 和后续事件。

5.3.4. 鼠标事件类型

鼠标事件类型如下所示。在嵌套元素的情况下,鼠标事件类型的事件目标总是嵌套最深的元素。 目标元素的祖先元素 可以 利用冒泡机制来获得在其后代元素发生的鼠标事件的通知。

5.3.4.1. auxclick
类型 auxclick
接口 PointerEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 多种
上下文
(可信事件)

当用户按下并释放非主要指针按键(次要按键和辅助按键)时, 或者以模拟这种操作的方式激活指针时, auxclick 事件类型 必须 被派发到指针指示的 最顶层的事件目标 上。 鼠标按键的致动方法取决于指针设备和环境配置,例如,它 可以 取决于屏幕位置或指针设备按键的按下和释放之间的延迟。

auxclick 事件只应被非主要指针按键触发 (即,当 button 不为 0 ,且按钮值大于 1 时) 。主按键 (如标准鼠标上的左键) 不得 触发 auxclick 事件。 请参阅 click 以获取与主按键关联的相应事件。

auxclick 事件触发之前 可以 是同一元素上触发的 mousedownmouseup 事件,而不考虑其他节点类型 (例如文本节点) 之间的更改。 根据环境配置,如果在按下和释放指针设备按键之间发生一个或多个 mouseovermousemovemouseout 事件, 则 可以 会派发 auxclick 事件。

auxclick 事件类型的 默认行为 根据事件的 事件目标buttonbuttons 属性的值而有所不同。 auxclick 事件类型的典型默认操作如下:

接收和处理点击中间按键触发的 auxclick 事件。
myLink.addEventListener("auxclick", function(e) { if (e.button === 1) { // 这将阻止默认行为,例如 // 在链接上单击鼠标中键时打开一个新选项卡。 e.preventDefault(); // 做一些其他事情来处理中间按键的点击, // 比如以适合应用程序的方式打开新选项卡中的链接或非链接按钮。 // 还有其他操作,如应该在点击操作中完成——关闭标签条中的标签, // 也可以在这里完成。 } });

在单击右键的情况下, auxclick 事件是在任何 contextmenu 事件之后派发的。请注意,一些用户代理在显示上下文菜单时会吞下所有输入事件, 因此 auxclick 可能不适用于此类场景中的应用程序。 请参阅 此示例 以获得更多说明。

接收和处理点击右键触发的 auxclick 事件
myDiv.addEventListener("contextmenu", function(e) { // 此调用确保不会显示任何上下文菜单来干扰页面接收事件。 e.preventDefault(); }); myDiv.addEventListener("auxclick", function(e) { if (e.button === 2) { // 做一些其他事情来处理右键点击, // 比如在应用程序中打开自定义的上下文菜单。 } });

5.3.4.2. click
类型 click
接口 PointerEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 Varies
上下文
(可信事件)

当用户按下并释放主要指针按键时,或者以模拟这种操作的方式激活指针时, click 事件类型必须被派发到指针指示的 最顶层的事件目标 上。 鼠标按键的致动方法取决于指针设备和环境配置,例如,它 可以 取决于屏幕位置或指针设备按键的按下和释放之间的延迟。

click 应仅针对主要指针按键触发 (即,当 button0buttons1 时) 。 辅助按钮 (如标准鼠标上的中键或右键) 不得触发 click 事件。 请参阅 auxclick 以获取与非主要按键关联的相应事件。

click 事件触发之前 可以 是同一元素上触发的 mousedownmouseup 事件,而不考虑其他节点类型 (例如文本节点) 之间的更改。 根据环境配置,如果在按下和释放指针设备按键之间发生一个或多个 mouseovermousemovemouseout 事件, 则 可以 会派发 click 事件。 click 事件之后 可以 还会触发 dblclick 事件。

如果用户在具有较大行高样式的 <p> 元素的子节点——文本节点上按下鼠标按键,稍微移动鼠标(不松开鼠标按键), 使其不再位于包含文本的区域的上方,但仍然位于该 <p> 元素的包含块内 (即,指针位于同一文本块的行之间,但不位于文本节点本身的上方) , 然后松开鼠标按键,因为用户一直处于同一元素的领域内,这可能仍然会触发 click 事件 (假设鼠标按键点击和释放的时间间隔落在 click 的正常时间上的 滞后 范围内) 。 请注意,用户代理生成的鼠标事件不会在文本节点上派发。

除了与指针设备关联外, click 事件类型必须 作为元素激活的一部分进行调度,如 § 3.5 激活触发器和行为 所述。

为了最大限度地提高可访问性,鼓励开发者在定义自定义控件的激活行为时使用 click 事件类型,而不是其他更特定于设备的定位设备事件类型,如 mousedownmouseup 。尽管 click 事件类型起源于指针设备(例如鼠标),但随后的实现增强将其扩展到了该关联之外, 并且可以将其视为用于元素激活的设备独立的事件类型。

click 事件类型的 默认行为 根据事件的 事件目标buttonbuttons 属性的值而有所不同。 click 事件类型的典型默认操作如下:

5.3.4.3. contextmenu
类型 contextmenu
接口 PointerEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 如果支持,调用出上下文菜单。
上下文
(可信事件)

用户代理 必须 在调用出上下文菜单之前派发此事件。

当鼠标右键触发 contextmenu 事件时, contextmenu 事件 必须 必须在 mousedown 事件之后被派发。

根据平台的不同, contextmenu 事件可以在 mouseup 事件之前或之后派发。

5.3.4.4. dblclick
类型 dblclick
接口 MouseEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当定位设备的主要按键在一个元素上被点击两次时,用户代理 必须 派发这个事件。双击的定义取决于环境配置, 但有一点是确定的: mousedownmouseupdblclick 时间 的事件目标 必须 相同。如果同时触发点击和双击时间, 则此事件类型( dblclick ) 必须 在事件类型 click 之后派发,并且在事件类型 mouseup 之后分派。

click 事件一样, dblclick 事件应该仅针对主要指针按键触发。 次要按键 必须 触发 dblclick 事件。

取消(调用 preventDefault() 方法) click 事件不会影响触发 dblclick 事件。

click 事件类型一样, dblclick 事件类型的 默认行为 根据事件的 事件目标buttonbuttons 属性的值而变化。通常, dblclick 事件类型的典型 默认行为 与对应的 click 事件类型的行为相匹配。

译者添加的 <strong>非标准</strong> 图示: 在一个具有文本内容的
				<p> 元素中进行双击操作,双击后触发的 <a><code>dblclick</code></a>
				事件的默认行为是选中了一个英文单词,随后再次单机,全选了
				<p> 元素中的其它可选部分
在一个具有文本内容的 <p> 元素中进行双击操作,双击后触发的 dblclick 事件的默认行为是选中了一个英文单词,随后再次单机,全选了 <p> 元素中的其它可选部分
5.3.4.5. mousedown
类型 mousedown
接口 MouseEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 多种: 开始一个 拖/放 (drag/drop) 操作; 开始一个文本选择 (text selection) 操作; 开始 滚动/平移 交互 (如果支持,可结合鼠标中键)
上下文
(可信事件)

当在元素上按下定位设备按键时,用户代理 必须 必须派发此事件。

许多实现使用 mousedown 事件来开始各种上下文相关的 默认行为 。如果取消此事件, 则可以阻止这些 默认行为 。 其中一些默认行为可能包括: 开始一个图像或链接的 拖/放 (drag/drop) 操作, 开始文本选择等。此外,一些实现提供了鼠标驱动的平移功能——当按下鼠标中键时, mousedown 被派发,该功能会被激活。

5.3.4.6. mouseenter
类型 mouseenter
接口 MouseEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当定位设备移动到元素或其派生元素的边界上时, 用户代理 必须 派发此事件。当元素或其后代元素之一移动到主要定位设备下方时, 用户代理必须 派发此事件。此事件类型类似于 mouseover ,但不同之处在于它不冒泡, 并且当指针设备从一个元素移动到它的一个后代元素的边界上时, 不得 (在原所在元素上)派发它。

此事件类型与CSS :hover伪类 [CSS2] 有相似之处。另请参阅 mouseleave 事件类型。

5.3.4.7. mouseleave
类型 mouseleave
接口 MouseEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当定位设备移出元素及其所有后代元素的边界时, 用户代理 必须 派发此事件。 当元素或其后代之一移动到不再位于主定位设备下方时,用户代理必须 派发此事件。 此事件类型类似于 mouseout ,但不同之处在于它不冒泡, 并且在定位备离开元素的边界及其所有后代元素的边界之前, 不得 (在原始元素上) 派发它。

此事件类型与CSS :hover伪类 [CSS2] 有相似之处。另请参阅 mouseenter 事件类型。

5.3.4.8. mousemove
类型 mousemove
接口 MouseEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当定位设备在元素上移动时, 用户代理 必须 派发此事件。 移动定位设备时移动事件的触发频率取决于具体的实现、设备和平台, 但 应当 为持续的指针设备移动触发多个连续的 mousemove 事件, 而不是为每个鼠标移动的实例触发一个事件。鼓励实现确定触发的最佳频率, 以平衡响应性和性能。

在一些实现环境中,例如浏览器,如果用户开始了拖动操作 (例如,按下鼠标按键) 并且定位设备已经离开了用户代理的边界, 则 mousemove 事件可以继续激发。

此事件以前在 DOM Level 2 Events 中被指定为不可取消, 但已更改为可取消,以反映用户代理之间现有的互操作性。

5.3.4.9. mouseout
类型 mouseout
接口 MouseEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当定位设备移出元素的边界时,或者当元素移动到不再位于主定位设备下方时, 用户代理 必须 派发此事件。此事件类型类似于 mouseleave ,但不同之处在于它可以冒泡, 并且当指针设备从一个元素移动到它的一个派生元素的边界上时, 必须 派发它。

另请参见 mouseover 事件类型。

5.3.4.10. mouseover
类型 mouseover
接口 MouseEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当定位设备移出元素的边界时,或者当元素移动到不再位于主定位设备下方时, 用户代理 必须 派发此事件。此事件类型类似于 mouseenter ,但不同之处在于它可以冒泡, 并且当指针设备移动到具有同一 事件监听器 实例的事件目标的祖先元素的边界上时, 必须 派发它。

另请参阅 mouseout 事件类型。

5.3.4.11. mouseup
类型 mouseup
接口 MouseEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当定位设备按键在元素上释放时,用户代理 必须 派发此事件。

在某些实现环境中,例如浏览器,即使定位设备离开了用户代理的边界, 也可以派发 mouseup 事件,例如, 用户按下鼠标按键开始拖动操作的场景。

5.4. 滚轮事件

滚轮是可以在一个或多个空间维度上旋转的设备,并且它通常与指针设备关联。 滚轮的坐标系取决于环境配置。

用户的环境可能被配置为将垂直滚动与沿y轴的旋转相关联, 将水平滚动与沿x轴的旋转相关联, 并将缩放与沿z轴的旋转相关联。

WheelEvent 对象的 deltaXdeltaYdeltaZ 属性表示沿其各自轴的测量值,单位为像素、行或页。 (这些属性)报告的测量值是通过特定于环境的算法将滚轮装置的实际 旋转 / 移动 转换为适当的值和单位后提供的。

用户的环境设置可以自定义,从而以不同的方式解释滚轮设备的实际 旋转 / 移动。 普通 有齿轮的 (dented) 鼠标滚轮的一次移动可以产生 162 像素的测量值 ( 162 只是一个示例值,实际值可能取决于用户代理的当前屏幕尺寸)。 但用户可以更改默认环境设置以加快鼠标滚轮的速度,从而增加这个数字。 此外,一些鼠标滚轮软件可以支持加速(滚轮旋转/移动得越快,每次测量的 增量 越大),甚至可以支持亚像素(sub-pixel) 旋转 测量值。 因此,开发者不能假定在一个用户代理中的给定一个旋转 测量值会在所有用户代理中产生相同的 增量 值。

deltaX 、 deltaY 和 deltaZ 属性的值的符号(正或负),在实际滚轮装置沿同一方向 旋转 / 移动 时,必须 在多次派发的 wheel 事件中保持一致。如果一个用户代理将滚动作为 wheel 事件的默认行为,那么 delta 的符号应该由右手坐标系给出,其中正 X 、 Y 和 Z 轴分别指向文档的最右边、 最底边和最远深度(远离用户)。

单个用户代理可以(取决于其环境和硬件配置)以不同的方式解释滚轮上的相同物理用户交互。 例如,从上到下在触控板边缘上的垂直滑动可以被解释为轮子动作, 其目的是向下滚动页面或向上移动页面(即,分别产生正或负的 deltaY 值)。

5.4.1. WheelEvent 接口

在本规范中引入介绍

WheelEvent 接口提供与 wheel 事件相关联的特定上下文信息。

要创建 WheelEvent 接口的实例,请使用 WheelEvent 构造函数, 并传递可选的 WheelEventInit 字典。

5.4.1.1. WheelEvent
[Exposed=Window]
interface WheelEvent : MouseEvent {
  constructor(DOMString type, optional WheelEventInit eventInitDict = {});
  // DeltaModeCode
  const unsigned long DOM_DELTA_PIXEL = 0x00;
  const unsigned long DOM_DELTA_LINE  = 0x01;
  const unsigned long DOM_DELTA_PAGE  = 0x02;

  readonly attribute double deltaX;
  readonly attribute double deltaY;
  readonly attribute double deltaZ;
  readonly attribute unsigned long deltaMode;
};
DOM_DELTA_PIXEL
delta 的测量单位 必须 必须是像素。 这是大多数操作系统和实现配置中最典型的情况。
DOM_DELTA_LINE
delta 的测量单位 必须 是单独的文本行。 许多表单控件都是这种情况。
DOM_DELTA_PAGE
delta 的测量单位 必须 是页面, (一个单位值)可以定义为单个屏幕,也可以定义为标定页面(demarcated page)。
deltaX, of type double, readonly
deltaXdouble 类型(64位双精度浮点数),只读
wheel 事件的默认行为是滚动(scroll)的用户代理中, 该值 必须 是在事件未取消的情况下, 沿 x 轴滚动的测量值(以像素、行或页面为单位)。否则(默认行为并非滚动), 这是滚轮设备围绕 x 轴的运动时,实现决定的测量值(以像素、行或页为单位)。

该属性的 未初始化值 必须0.0

deltaY, of type double, readonly
deltaYdouble 类型(64位双精度浮点数),只读
wheel 事件的默认行为是滚动(scroll)的用户代理中, 该值 必须 是在事件未取消的情况下, 沿 y 轴滚动的测量值(以像素、行或页面为单位)。否则(默认行为并非滚动), 这是滚轮设备围绕 y 轴的运动时,实现决定的测量值(以像素、行或页为单位)

该属性的 未初始化值 必须0.0

deltaZ, of type double, readonly
deltaZdouble 类型(64位双精度浮点数),只读
wheel 事件的默认行为是滚动(scroll)的用户代理中, 该值 必须 是在事件未取消的情况下, 沿 z 轴滚动的测量值(以像素、行或页面为单位)。否则(默认行为并非滚动), 这是滚轮设备围绕 z 轴的运动时,实现决定的测量值(以像素、行或页为单位)

该属性的 未初始化值 必须0.0

deltaMode, of type unsigned long, readonly
deltaModeunsigned long 类型(32位无符号整型),默认值为 0
deltaMode 属性包含对 delta 值的测量单位的指示。 默认值为 DOM_DELTA_PIXEL (像素)。

此属性 必须 设置为 DOM_DELTA 常量之一, 以指示 delta 值的测量单位。 合适(precise)的测量单位是由设备、操作系统和应用程序配置共同决定的。

该属性的 未初始化值 必须0

5.4.1.2. WheelEventInit
dictionary WheelEventInit : MouseEventInit {
  double deltaX = 0.0;
  double deltaY = 0.0;
  double deltaZ = 0.0;
  unsigned long deltaMode = 0;
};
deltaX, of type double, defaulting to 0.0
deltaXdouble 类型(64位双精度浮点数),默认值为 0.0
查阅下面的 deltaZ 属性。
deltaY, of type double, defaulting to 0.0
deltaYdouble 类型(64位双精度浮点数),默认值为 0.0
查阅下么 deltaZ 属性。
deltaZ, of type double, defaulting to 0.0
deltaZdouble 类型(64位双精度浮点数),默认值为 0.0
初始化 WheelEvent 对象的 deltaZ 属性。 该属性(以及deltaX和deltaY属性) 的相对正值由右手坐标系给出,其中 X 、 Y 和 Z 轴分别指向文档的最右边、最下边和最远深度(远离用户), 相对负值在各自相反的方向上。
deltaMode, of type unsigned long, defaulting to 0
deltaModeunsigned long 类型(32位无符号整型),默认值为 0
可以将 WheelEvent 对象上的 deltaMode 属性初始化为枚举值 0 、 1 或 2 ,如果滚轮 旋转 会导致滚动,这些值分别表示滚动的像素量 ( DOM_DELTA_PIXEL )、滚动的行数 ( DOM_DELTA_LINE )或滚动的页数 ( DOM_DELTA_PAGE )。

初始化 WheelEvent 对象的 deltaZ 属性。 该属性(以及deltaX和deltaY属性)的相对正值由右手坐标系给出, 意思就是 daltaX/Y/Z 属性的值的正负符号确定和文档位置坐标系相同。 对于鼠标设备而言, 逆时针 滚动鼠标滚轮(向下,向右或向远离用户)时, delta 值为正, 顺时针 滚动鼠标滚轮(向上,向左或靠近用户)时, delta 值为负。

5.4.2. Wheel Event Types

5.4.2.1. wheel
类型 wheel
接口 WheelEvent
同步 / 异步 异步
冒泡
可信目标对象 Element
可取消默认行为 多种情况
能否从Shadow
DOM冒泡传递
默认行为 滚动(或缩放)文档
上下文
(可信事件)
  • Event.target : 最顶层的事件目标
  • UIEvent.view : Window
  • UIEvent.detail : 0
  • MouseEvent.screenX : 如果滚轮与定位设备相关联, 则是基于屏幕上指针(水平)位置的值, 否则为 0
  • MouseEvent.screenY : 如果滚轮与定位设备相关联, 则是基于屏幕上指针(竖直)位置的值, 否则为 0
  • MouseEvent.clientX : 如果滚轮与定位设备相关联, 则是基于视口上指针(水平)位置的值, 否则为 0
  • MouseEvent.clientY : 如果滚轮与定位设备相关联, 则是基于视口上指针(竖直)位置的值, 否则为 0
  • MouseEvent.altKey : 如果 Alt 修饰符处于活动状态,则为 true ,否则为 false
  • MouseEvent.ctrlKey : 如果 Ctrl 修饰符处于活动状态, 则为 true ,否则为 false
  • MouseEvent.shiftKey : 如果 Shift 修饰符处于活动状态, 则为 true ,否则为 false
  • MouseEvent.metaKey : 如果 Meta 修饰符处于活动状态, 则为 true ,否则为 false
  • MouseEvent.button : 如果滚轮与定位设备相关联, 则值基于当前设备按下的按键, 否则为 0
  • MouseEvent.buttons : 如果滚轮与定位设备相关联, 则值基于当前设备按下的所有按键, 如果没有按键按下,则为 0
  • MouseEvent.relatedTarget : 指示定位设备所指向的 事件目标 (如果有)
  • WheelEvent.deltaX : 页面根据 deltaMode 表示的单位沿 x 轴滚动的预期量; 或滚轮绕 x 轴运动的实现决定的值
  • WheelEvent.deltaY : 页面根据 deltaMode 表示的单位沿 y 轴滚动的预期量; 或滚轮绕 y 轴运动的实现决定的值
  • WheelEvent.deltaZ : 页面根据 deltaMode 表示的单位沿 z 轴滚动的预期量; 或滚轮绕 z 轴运动的实现决定的值
  • WheelEvent.deltaMode : deltaX 、 deltaY 和 deltaZ 属性的单位指示符(像素、行或页)

当鼠标滚轮沿着任何轴旋转/滚动时,或当等效输入设备 (如鼠标球、某些平板电脑或触摸板等)模拟了此类动作时, 用户代理 必须 派发 wheel 事件。根据平台和输入设备,对于旋钮的 deltas (diagonal wheel deltas),(它的事件)交付方式 既 可以 是多个非零轴的 delta 整合入单个 wheel ,又 可以 是为每个非零轴的 delta 触发单独的 wheel 事件。

非零轴向包括 X 轴、 Y 轴和 Z 轴。在 delta 不为 0 时, delta 可以是 X , Y, Z 三个轴上的增量值, 上述介绍了两种处理旋钮操作产生多个轴方向不同的 deltas 值时的交付方式——既可以整合到一个 wheel , 使用三个轴对应的 deltaXdeltaYdeltaZ 属性指示各种轴增量值; 又可以为三个轴上的增量值派发三个 wheel 事件,只使用各自的 delta 指示对应的属性值。

wheel 事件类型的典型 默认行为 是按(用户代理)指定的数量滚动(或在某些情况下缩放)文档。如果此事件被取消, 则实现 不得 滚动或缩放文档 (或执行与此事件类型相关的任何其他实现决定的的默认行为)。

在一些 用户代理 中,或者在一些输入设备中, 滚轮转动的速度会影响 delta 值,更快的速度会产生更高(/大)的 delta 值。

5.4.2.2. 滚轮事件的可取消性

在一个滚轮事件上调用 preventDefault 可以阻止或中断滚动。 为了获得最大的滚动性能, 用户代理可能不会等待每个与滚动相关联的滚轮事件被处理完毕 (检阅滚轮事件是否被取消)才派发事件。在这种情况下,用户代理应该生成 cancelable 属性为 falsewheel 事件, 表明 preventDefault 不能用于阻止或中断滚动。否则 cancelable 属性将为 true

特别是,当用户代理发现事件 没有非被动监听器(non-passive listeners) 时,它应该只生成不可取消(uncancelable)的 wheel 事件。

[DOM] 中的 EventTarget 接口中介绍了 addEventListener() 方法的第三个参数, 它的字典定义有一个 passive 属性,表示 事件监听器 是否永远不会调用 preventDefault() ,非被动监听器(non-passive listeners)就是 passive 设置为 false (默认值)的 事件监听器 ,它表示事件可被取消; 再理解上面的话,特意设置 passive 属性为 true ,那么实现只会生成不可取消的 wheel 事件。 总结一下就是:
wheel 的默认监听器就是非被动监听器( passive 默认为 false),所以一般的用户代理默认情况下允许在 wheel 的事件处理程序中调用 preventDefault() , 并且可以生效,生成的事件对象的 cancelable 属性值为 true;
② 如果在使用 addEventListener() 给元素节点添加 wheel 的事件处理程序时,特意传入第三个参数且设置其 passive 属性为 true, 那么这个事件的监听器就是被动监听器(passive listener),符合上述的 没有非被动监听器(non-passive listeners) 的情况。 此时用户代理不允许在 wheel 的事件处理程序中调用 preventDefault(),如果调用也不会生效,生成的事件对象的 cancelable 属性值为 false;

scroll 事件类型的事件对象在 DOM2 中原本属于 § 5.1.2 用户界面事件类型 中定义的事件,为了保持事件类型定义的一致性, 它被移出了 § 5.1.2 用户界面事件类型 规范的事件类型中, 而是在 [CSSOM-View] scrolling-events 进行了明确说明,现在属于 Event 接口定义的事件。 scroll 事件在以前的混杂模式下,通常是监听 window 对象以发现页面中相应元素变化,但是目前在标准模式下,对 document 对象以及元素添加 scroll 事件类型的事件监听器是正确的做法,可以通过这些被监听元素的 scrollLeftscrollTop 属性获取垂直与水平滚动的距离。需要注意,scroll 事件是不冒泡,不可取消,同步触发的事件类型,而 wheel 是冒泡的, 取消可控制的,异步触发的事件类型。

5.5. 输入事件

每当 DOM 作为用户操作的直接结果而被更新(或即将被更新)时, 输入事件都会作为通知被派发(例如,可编辑区域的中的键盘输入, 删除或设置文本格式...)。

5.5.1. InputEvent 接口

5.5.1.1. InputEvent

在DOM Level 3中引入介绍

[Exposed=Window]
interface InputEvent : UIEvent {
  constructor(DOMString type, optional InputEventInit eventInitDict = {});
  readonly attribute DOMString? data;
  readonly attribute boolean isComposing;
  readonly attribute DOMString inputType;
};
data, of type DOMString, readonly, nullable
dataDOMString 类型,只读,可空
data 保存由一种输入法生成的字符的值。 这 可以 是一个简单的 Unicode 字符或一个非空的 Unicode 字符序列 [Unicode] 。字符 应当 按照 Unicode 规范化形式 NFC 的定义进行规范化,它在 [UAX15] 中定义。 这个属性 可以 包含 空字符串

该属性的 未初始化值 必须null

isComposing, of type boolean, readonly
isComposingboolean 类型,只读
如果输入事件作为一个合成会话(composition session)的一部分发生, 该属性值为 true ,也就是说,在一个 compositionstart 事件之后,在对应的 compositionend 事件之前触发。

该属性的 未初始化值 必须false

inputType, of type DOMString, readonly
inputTypeDOMString 类型,只读
inputType包含一个字符串,用于标识与事件关联的输入类型。

有关此属性的有效值列表,参考 [Input-Events] 规范

该属性的 未初始化值 必须 是空字符串 ""

5.5.1.2. InputEventInit
dictionary InputEventInit : UIEventInit {
  DOMString? data = null;
  boolean isComposing = false;
  DOMString inputType = "";
};
data, of type DOMString, nullable, defaulting to null
dataDOMString 类型,可空,默认值为 null
初始化 InputEvent 对象的 data 属性。
isComposing, of type boolean, defaulting to false
isComposingboolean 类型,默认值为 false
初始化 InputEvent 对象的 isComposing 属性。
inputType, of type DOMString, defaulting to ""
inputTypeDOMString 类型,默认值为 ""
初始化 InputEvent 对象的 inputType 属性。

5.5.2. 输入事件顺序

本规范中定义的输入事件 必须 按相对于彼此的固定顺序发生。

事件类型 注释
1 beforeinput
DOM 元素被更新
2 input

5.5.3. 输入事件类型

5.5.3.1. beforeinput
类型 beforeinput
接口 InputEvent
同步 / 异步 同步
冒泡
可信目标对象 Element (特别的,应该是能被控制的元素类型,例如 HTMLInputElement , 等) 或者是其他设置了 contenteditable 属性的 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 更新DOM元素
上下文
(可信事件)

当 DOM 即将更新时, 用户代理 必须派发此事件。

5.5.3.2. input
类型 input
接口 InputEvent
同步 / 异步 同步
冒泡
可信目标对象 Element (特别的,应该是能被控制的元素类型,例如 HTMLInputElement, 等) 或者是其他设置了 contenteditable 属性的Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当DOM被更新后,用户代理必须立即派发此事件

5.6. 键盘事件

键盘事件是依赖设备的,也就是说, 键盘事件依赖于输入设备的能力以及输入设备在操作系统中的映射方式。 这种映射方式可以参阅 键盘事件和键值 , 其中包括键盘事件如何与合成事件结合使用的例子。键盘事件是否会生成, 取决于具体的字符生成设备(character generation device)。

键盘事件只是提供一种文本输入的形式(modality),对于编辑场景,也可以考虑使用 InputEvent 作为键盘事件的替代(或补充)。

5.6.1. KeyboardEvent 接口

在本规范中引入介绍:

KeyboardEvent 接口提供具体的和键盘设备相关的上下文信息。 每个键盘事件都是由一个值引用一个按键。键盘事件通常指向具有焦点的元素。

KeyboardEvent 接口为常见的修饰符按键——ctrlKey, shiftKey, altKey, metaKey提供方便使用的属性。这些属性的值可以等价使用 getModifierState() 方法通过传递对应getModifierState() with Control, Shift, Alt, 或 Meta等按键修饰符获取。

为了创建一个KeyboardEvent接口的实例,可以使用KeyboardEvent的构造函数,并传递一个可选的KeyboardEventInit字典。

5.6.1.1. KeyboardEvent
[Exposed=Window]
interface KeyboardEvent : UIEvent {
  constructor(DOMString type, optional KeyboardEventInit eventInitDict = {});
  // KeyLocationCode(按键位置码)
  const unsigned long DOM_KEY_LOCATION_STANDARD = 0x00;
  const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;
  const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;
  const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;

  readonly attribute DOMString key;
  readonly attribute DOMString code;
  readonly attribute unsigned long location;

  readonly attribute boolean ctrlKey;
  readonly attribute boolean shiftKey;
  readonly attribute boolean altKey;
  readonly attribute boolean metaKey;

  readonly attribute boolean repeat;
  readonly attribute boolean isComposing;

  boolean getModifierState(DOMString keyArg);
};
DOM_KEY_LOCATION_STANDARD
激活按键(key activation) 不得 区分为按键的左侧或右侧版本,并且( NumLock 键除外) 激活按键不能源自数字键盘(或不能源自与数字键盘对应的虚拟按键)。

一个 PC 101 美国标准键盘上的 Q 键。
一个 PC 101 美国标准键盘上的 NumLock 键。
一个 PC 101 美国标准键盘上,位于键盘主要区域的 1 键。

标准按键位置: 这个位置下的按键不存在左右两个按键 (一般有左右两个的键都有属于修饰键),且不包括小键盘区域的按键,详情见 [UIEvents-Code]修饰符按键小键盘
DOM_KEY_LOCATION_LEFT
激活按键源自左侧按键位置(当该按键可能有多个位置时)。

PC 101 美国键盘上左侧的 Control 键。

DOM_KEY_LOCATION_RIGHT
激活按键源自右侧按键位置(当该按键可能有多个位置时)。

PC 101 美国键盘上右侧的 Shift 键。

DOM_KEY_LOCATION_NUMPAD
激活按键源于数字 小键盘 或与数字 小键盘 对应的虚拟按键 (当该按键可能有多个位置时)。请注意, NumLock 键的 location 属性应始终编码为 DOM_KEY_LOCATION_STANDARD

PC 101 美国键盘的数字板(就是小键盘)的 1 键。

按键位置码代表的四个位置分别称为: 标准按键位置,左侧按键位置, 右侧按键位置,数字板按键位置,关于它们具体包含的按键如下图, 该图例举出了 PC 101 美国键盘上的四个位置的按键所属, 其它标准键盘请参阅 [UIEvents-Code]键盘布局
美式标准 "101" 键盘所有按键对应的各自所属位置
美式标准 "101" 键盘所有按键对应的各自所属 location
key, of type DOMString, readonly
keyDOMString 类型,只读
key 保存与所按下按键相对应的 键属性值

key 属性与遗留的 keyCode 属性无关, 并且没有相同的值集。

该属性的 未初始化值 必须 是空字符串 ""

code, of type DOMString, readonly
codeDOMString 类型,只读
code 保存一个字符串,用于标识正在按下的物理键。 该值不受当前键盘布局或修饰键状态的影响, 因此特定物理按键将始终返回相同的值。

该属性的 未初始化值 必须 是空字符串 ""

location, of type unsigned long, readonly
locationunsigned long 类型(32位无符号整型),只读
location 属性保存上述四个按键位置码(KeyLocationCode) 之一,它指示按键在设备上的逻辑位置。

此属性 必须 设置为 DOM_KEY_LOCATION 常量之一,以指示按键在设备上的位置。

如果 用户代理 允许重新映射按键, 则 必须 将重新映射的按键的 location 值设置为适合新按键的值。 例如,如果 "ControlLeft" 键映射到 "KeyQ" 键,则 location 属性 必须 设置为 DOM_KEY_LOCATION_STANDARD 。相反,如果 "KeyQ" 键被重新映射到 其中一个 Control 键,则 location 属性 必须 设置为 DOM_KEY_LOCATION_LEFTDOM_KEY_LOCATION_RIGHT

该属性的 未初始化值 必须0.

ctrlKey, of type boolean, readonly
ctrlKeyboolean 类型,只读
如果 Control (control)键修饰符处于活动状态,则为 true

该属性的 未初始化值 必须false

shiftKey, of type boolean, readonly
shiftKeyboolean 类型,只读
如果shift( Shift )键修饰符处于活动状态,则为 true

该属性的 未初始化值 必须false.

altKey, of type boolean, readonly
altKeyboolean 类型,只读
如果 Alt (alternative)(或 "Option" )键修饰符处于活动状态, 则为 true

该属性的 未初始化值 必须false.

metaKey, of type boolean, readonly
metaKeyboolean 类型,只读
如果meta( Meta )键修饰符处于活动状态,则为 true

在Macintosh系统(苹果电脑)上的 "Command" ( "⌘" ) 键修饰符使用此键修饰符表示。

该属性的 未初始化值 必须false.

repeat, of type boolean, readonly
如果按键被持续按下,则为 true 。持续按下一个键 必须 导致事件 keydownbeforeinputinput ,按此触发顺序重复(派发), 重复的速率由系统配置决定。对于具有 长按按键(long-key-press) 行为的移动设备, repeat 属性值为 true 的第一个按键事件 必须 用作 长按按键(long-key-press) 的指示。为了开启重复效果的按键 必须 被按下的时间长度是依赖配置的 (由配置决定)。
Long-key-press行为是一种用户交互行为, 通常指用户在按下键盘上的某个键时,停留的时间超过了一定的阈值, 例如超过0.5秒或者1秒。 这种行为通常被视为用户在积极地与计算机进行交互,而不是简单地按下按键。
在计算机图形学和人机交互领域,long-key-press 行为通常被用于触发一些特定的功能或者操作。例如,在一些文本编辑器中, 当用户在按下某个键超过一定时间后,会出现一个弹出菜单, 显示与该键相关的操作选项。在其他应用程序中, long-key-press行为则可能被用于执行复制、粘贴、撤销等常见操作。
理解long-key-press行为的关键在于理解其背后的意图和行为逻辑。 与简单地按下按键不同,long-key-press 行为通常意味着用户希望执行某些特定的操作, 而这些操作可能是由计算机系统或者应用程序提供的。因此,理解 long-key-press行为的含义和用途可以帮助我们更好地使用计算机和应用程序, 提高我们的生产力和效率。
——文心一言

该属性的 未初始化值 必须false.

isComposing, of type boolean, readonly
isComposingboolean 类型,只读
如果按键事件作为合成会话(composition session)的一部分发生,即在 compositionstart 事件之后和相应的 compositionend 事件之前,则为 true ,否则为 false

该属性的 未初始化值 必须false.

getModifierState(keyArg)
使用键值查询修饰键的状态。

如果它(传入的键值)是修饰键并且修饰键处于激活状态,则返回 true ,否则返回 false

DOMString keyArg
修饰符键值。有效的 修饰键 在 [[UIEvents Key]] 中的 修饰符键值表格 中定义。

如果应用程序希望区分左右修饰键,则可以使用键盘事件和 location 来推断此信息。

"修饰按键","修饰符按键","修饰键","修饰符",这几种不同的说法, 在本规范的翻译中都表示"修饰符按键",即"Modifier Keys", 有时候也会使用"modifiers"简化表示。它是计算机键盘上的一种特殊键 (或组合键),当按下时, 它会临时修改另一个键的正常功能。
常见的修饰键有 ShiftAltCtrl 等, 想要了解修饰符按键的功能定义,可以查阅 修饰符按键 , 想要知晓本方法检查修饰键的状态传入的所有参数,如上述,查阅 修饰符键值表格
getModifierState(keyArg) 方法不会区分是左修饰符按键还是右修饰符按键被激活, 这是由传入的参数是修饰符键值(modifier key value),也就是修饰符 键属性值 决定的,因为它不区分按键的左右。除了通过 location 来区分左右修饰键,还可以直接通过键码值 code 来区分。
5.6.1.2. KeyboardEventInit
dictionary KeyboardEventInit : EventModifierInit {
  DOMString key = "";
  DOMString code = "";
  unsigned long location = 0;
  boolean repeat = false;
  boolean isComposing = false;
};
key, of type DOMString, defaulting to ""
keyDOMString 类型,默认值为""
将所有键盘修饰符(如shift-state)纳入考虑范围在考虑后,将键盘事件 (KeyboardEvent)对象的 key 属性初始化为表示该键含义的 unicode 字符串。该值是按键的最终有效值。如果键不是可打印字符, 则它应该是 [UIEvents-Key] 中定义的键值之一。
code, of type DOMString, defaulting to ""
codeDOMString 类型,默认值为""
忽略键盘布局等任何键盘配置变动,将键盘事件(KeyboardEvent) 对象的 code 属性初始化为表示为按下的物理键的 unicode 字符串。此值应该是[UIEvents-Code] 中定义的键码值之一。
键盘事件对象的键值就是接口中定义的 key 属性值, 键盘事件的码值就是接口中定义的 code 属性值, 前者表示按键的含义通常与键入值有关,会因为区域设置有所不同, 后者表示物理按键的编码,用于标识每个独立的物理按键。在翻译过程中, "键值","键属性值","按键值"都是 key 属性值,即 "key value" ; "码值","键码值","码属性值","键码属性值"都是 code 属性值,即 "code value" 。关于二者的含义以及所表示的值集合,可以参阅 用户界面事件键盘事件 key 属性值 用户界面事件键盘事件 code 属性值
location, of type unsigned long, defaulting to 0
locationunsigned long 类型(无符号2字节整型),默认为 0
将键盘事件(KeyboardEvent)对象的 location 属性初始化为以下表示位置的数值常量之一:
repeat, of type boolean, defaulting to false
repeatboolean 类型,默认值为 false
初始化键盘事件(KeyboardEvent)对象的 repeat 属性。 如果当前键盘事件(KeyboardEvent)被认为是由长时间按下(非规范补充: 见于 reapeat属性自定义注释 ) 任何单个键引起的类似事件的重复序列的一部分,则该属性应设置为 true ,否则为 false
isComposing, of type boolean, defaulting to false
isComposingboolean 类型,默认值为 false
初始化键盘事件(KeyboardEvent)对象的 isComposing 属性。 如果正在构建的事件是作为合成序列的一部分发生的,则该属性应设置为 true ,否则为 false
遗留的键盘事件实现包括三个额外的属性, keyCodecharCodewhichkeyCode 属性表示与计算机键盘上某个特定键关联的数值,而 charCode 属性则表示与该键关联的字符的 ASCII 值(可能与keyCode值相同), 并且仅适用于生成 字符值 的键。

在实践中, keyCodecharCode 在不同的平台上不一致, 甚至相同的实现在不同的操作系统上或使用不同的本地化都会有区别。 此规范既没有定义 keyCodecharCode 的值, 也没有定义这两个遗留属性的行为。在符合规范的用户界面事件实现中, 内容作者可以使用 keycode 作为替代。

获取更多相关信息,请参阅有关 遗留键属性 的资料性性附录。

为了与现有内容兼容,虚拟键盘,如基于屏幕的输入设备上的软件键盘, 预计会产生正常范围的键盘事件,即使它们不具有物理键。

在某些实现或系统配置中,某些按键事件或其按键值可能会被使用中的 输入法编辑器(IME) 抑制(suppressed)。

5.6.2. 键盘事件键位置

location 属性可用于消除键盘上不同物理键 (例如,左右 Shift 键或物理箭头键与当 NumLock 关闭时的数字键盘箭头键)生成的 key 值之间的歧义。

下表定义了键盘上具有多余一个位置的特殊键的有效 location 值:

KeyboardEvent . key 有效 location
"Shift", "Control", "Alt", "Meta" DOM_KEY_LOCATION_LEFT, DOM_KEY_LOCATION_RIGHT
"ArrowDown", "ArrowLeft", "ArrowRight", "ArrowUp" DOM_KEY_LOCATION_STANDARD, DOM_KEY_LOCATION_NUMPAD
"End", "Home", "PageDown", "PageUp" DOM_KEY_LOCATION_STANDARD, DOM_KEY_LOCATION_NUMPAD
"0", "1", "2", "2", "4", "5", "6", "7", "8", "9", ".", "Enter", "+", "-", "*", "/" DOM_KEY_LOCATION_STANDARD, DOM_KEY_LOCATION_NUMPAD

对于此表中未列出的所有其他键, location 属性 必须 始终设置为 DOM_KEY_LOCATION_STANDARD

本节规范描述,不同的物理按键生成相同键值时,用 location 属性进行区分的说法可行但是反而难以促进理解(个人观点)。因为通常而言, 标识物理按键的不是键值,而是码值,用键值来区分按键本身就不合理,其次, 标准键盘上每个物理按键的 location 是它所在键盘上的物理位置决定的,与键值没有强关联,在梳理按键的 location 属性值时,参考在键盘事件接口介绍部分引入的 位置码与键盘布局关系图 即可。

5.6.3. 键盘事件顺序

对于任何给定的键,本规范中定义的键盘事件按相对于彼此的固定顺序发生:

事件类型 注释
1 keydown
2 beforeinput (仅适用于能产生 字符值 的键)
与该键相关的任何 默认行为 , 例如在 DOM 中插入字符。
3 input (仅适用于已用于更新了 DOM 的键)
由于按键在一段时间被持续按下而导致的任何事件 (见下文)。
4 keyup

如果按键持续按下,以下事件 可以 以环境配置的速率重复发生:

事件类型 注释
1 keydown (repeat 属性被设置成 true)
2 beforeinput (仅适用于能产生 字符值 的键)
与该键相关的任何 默认行为 , 例如在 DOM 中插入字符。
3 input (仅适用于已用于更新了 DOM 的键)

通常,与任何特定键相关联的任何 默认行为 都会在派发 keyup 事件之前完成。这可能会稍微延迟 keyup 事件的派发(尽管该延迟难以感知)。

键事件的 事件目标 是当前的焦点元素, 即正在处理键盘活动的元素。这通常是 HTML input 元素或可编辑的文本元素,但也 可以 是由 宿主语言 定义的元素, 用于接受非文本目的的键盘输入,例如加速按键(accelerator key) 的激活或触发某些其他行为。如果没有合适的焦点元素,则事件目标将是 HTML body元素 (如果可用),否则为 根元素

事件目标 可能在不同的按键事件之间发生变化。 例如,在同一次击键(keystroke)过程中, Tab 键的 keydown 事件可能与的 keyup 事件具有不同的 事件目标

5.6.4. 键盘事件类型

5.6.4.1. keydown
类型 keydown
接口 KeyboardEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 多种: (触发) beforeinputinput 事件; 启动 文本合成系统 ; (触发) blurfocus 事件; (触发) keypress 事件 (如果支持); (执行) 激活行为 ; (触发)其它事件
上下文
(可信事件)

当按下某个键盘按键时, 用户代理 必须 派发此事件。 keydown 事件类型是依赖设备的,它依赖输入设备的功能以及它们在操作系统中的映射方式。 此事件类型 必须键映射 之后生成。此事件类型 必须 在与同一个键关联的 beforeinputinputkeyup 事件之前被派发。

keydown 事件的默认行为取决于按键:

如果此事件被取消,则 不得 派发关联的事件类型,并且 不得 执行关联的行为。

keydownkeyup 事件传统上与能检测到的任何按键相关联, 而不仅仅是那些产生 字符值 的键。

5.6.4.2. keyup
类型 keyup
接口 KeyboardEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当按键被释放时,用户代理 必须 派发此事件。 keyup 事件类型是依赖设备的,它依赖输入设备的功能以及它们在操作系统中的映射方式。 此事件类型 必须键映射 之后生成。此事件类型 必须keydownbeforeinput 和与同一个键关联的 input 事件之后被派发。

keydownkeyup 事件传统上与能检测到的任何按键相关联, 而不仅仅是那些产生 字符值 的键。

5.7. 合成事件

合成事件(Composition Events)提供了一种以补充或替代键盘事件(Keyboard Events) 的形式进行文本输入的方法,以便允许使用键盘上可能不常见(不能直接键入)的字符。 例如,尽管标准的美国键盘上不存在重音字符(比如"à"), 但合成事件可以用于: 为一般字符添加重音符号(以便输入重音字符); 根据亚洲语言的基本组件或类别建立许多的语标书写法(logograms); 从移动设备键盘上的组合按键中选择单词; 或使用语音识别处理器将语音命令转换为文本。参见 § 6 键盘事件和键值 寻找合成事件与键盘事件如何结合使用的例子。

从概念上讲,合成会话(composition session)由一个 compositionstart (合成启动)事件、一个或多个 compositionupdate (合成更新)事件和一个 compositionend (合成结束)事件组成, data 属性的值在每个会话期间保持在该事件链的每个 阶段(stage) 之间。

注意: 当合成会话(composition session)处于活动状态时,如果键盘输入设备能使用合成会话, 则可以将键盘事件分派到 DOM 。请参阅 compositionstart 事件详细信息和 IME 部分 以了解相关事件的触发排序。

并非所有 输入法编辑器 系统或设备都将必要的数据暴露给 DOM , 因此活动的合成字符串( 阅读窗口(Reading Window)候补选择菜单选项 )可能无法通过该接口(指合成事件 API)使用, 在这种情况下,选择文本 可以空字符串 表示。

5.7.1. CompositionEvent 接口

在本规范中引入介绍

CompositionEvent 接口提供与合成事件(Composition Events) 相关联的特定上下文信息。

要创建 CompositionEvent 接口的实例,请使用 CompositionEvent 构造函数,传递一个可选的 CompositionEventInit 字典。

5.7.1.1. CompositionEvent
[Exposed=Window]
interface CompositionEvent : UIEvent {
  constructor(DOMString type, optional CompositionEventInit eventInitDict = {});
  readonly attribute DOMString data;
};
data, of type DOMString, readonly
dataDOMString 类型,只读
data 保存由输入法生成的字符值。这 可以 是单个 Unicode 字符,也可能是非空的 Unicode 字符序列 [Unicode] 。字符 应当 按照 [UAX15] 中定义的 Unicode 规范化形式 NFC 进行标准化。 此属性 可以空字符串

该属性的 未初始化值 必须"" (空字符串)。

5.7.1.2. CompositionEventInit
dictionary CompositionEventInit : UIEventInit {
  DOMString data = "";
};
data, of type DOMString, defaulting to ""
datadata 类型,默认值为 ""
将 CompositionEvent 对象的 data 属性初始化为 IME 合成产生的字符。

5.7.2. 合成事件顺序

本规范中定义的合成事件(Composition Events) 必须 按以下相对于彼此的固定顺序发生:

事件类型 注释
1 compositionstart
2 compositionupdate 多次派发事件
3 compositionend

5.7.3. 手写识别系统

以下示例描述了使用手写识别系统(handwriting recognition system) (例如在手写板上) 编写(text) 一个文本段时可能发生的一系列事件, 这些事件序列基于合成事件(Composition Events)。

事件类型 CompositionEvent
data
注释
1 compositionstart ""
用户在平板电脑屏幕上书写文字
2 compositionupdate "test"
用户拒绝第一个单词匹配建议, 选择不同的匹配
3 compositionupdate "text"
4 compositionend "text"
对于中文输入法而言,无论是手写识别系统输入,还是拼音输入法输入, 亦或是五笔输入法输入,其本质都会触发合成事件,给出一系列中文词语选项, 让用户进行单词匹配的过程,合成事件发生顺序和上表是一致的。 下面是微软的中文拼音输入法图示:
拼音输入法编辑器
拼音输入法编辑器

5.7.4. 取消合成事件

如果某个 keydown 事件被取消,则 不应 派发因该 keydown 而触发的任何组合事件(Composition Events):

事件类型 注释
1 keydown 默认行为 被阻止,即, 通过调用 preventDefault()
不会派发合成事件
2 keyup

如果取消了初始的 compositionstart 事件,则 应当 终止文本合成会话(composition session)。 无论合成会话是否终止,都 必须 发送 compositionend 事件。

事件类型 注释
1 keydown
2 compositionstart 默认行为 被阻止 ,即,通过调用 preventDefault()
没有其它合成事件被派发
3 compositionend
4 keyup

5.7.5. 合成过程中的按键事件

在合成会话期间, keydownkeyup 事件仍 必须 发送,并且这些事件 必须isComposing 属性设置为 true

事件类型 KeyboardEvent
isComposing
注释
1 keydown false 这是启动合成的按键事件。
2 compositionstart
3 compositionupdate
4 keyup true
... 合成会话期间发送的任何按键事件都 必须isComposing 设置为 true
5 keydown true 这是退出合成的按键事件。
6 compositionend
7 keyup false

5.7.6. 合成过程中的输入事件

在合成会话(composition session)期间,compositionupdate 必须 在发送 beforeinput 之后,但在发送 input 事件之前被派发。

事件类型 注释
1 beforeinput
2 compositionupdate
此时会发生任何可能的 DOM 更新。
3 input

大多数 IMEs 不支持在合成会话期间取消更新。

每当 DOM 作为合成的一部分更新时, beforeinputinput 事件都会与 compositionupdate 事件一起被派发。由于没有与 compositionend 事件相关联的DOM更新,因此此时(合成结束时)不应发送 beforeinputinput 事件。

事件类型 注释
1 beforeinput 取消此操作将阻止 DOM 更新和 input 事件(的派发)。
2 compositionupdate
此时会发生任何可能的 DOM 更新。
3 input 仅当 DOM 已更新时才发送。
4 compositionend
结合上面两节的内容,我们可以得出如下的表格,它显示出了合成事件,输入事件, 键盘事件三种在使用 IME 输入自定义字符时触发的事件顺序:
事件类型 KeyboardEvent
isComposing
注释
1 keydown false 这是启动合成的按键事件。
2 compositionstart
合成会话期间发送的任何按键事件和输入事件都 必须isComposing 设置为 true
3 beforeinput true 取消此操作将阻止 DOM 更新和 input 事件(的派发)。
4 compositionupdate
此时会发生任何可能的 DOM 更新。
5 input true 仅当 DOM 已更新时才发送。
6 keyup true
7 keydown true 这是持续进行合成的按键事件。
8 beforeinput true 取消此操作将阻止 DOM 更新和 input 事件(的派发)。
9 compositionupdate
此时会发生任何可能的 DOM 更新。
10 input true 仅当 DOM 已更新时才发送。
11 keyup true
... 对7 - 11 事件派发的重复 (如果这一次合成会话持续进行的话)
12 keydown true 这是退出合成的按键事件。(可能为空格按键)
13 beforeinput true
14 compositionupdate
15 input true 仅当 DOM 已更新时才发送。一般而言, 该事件的 data 是用户在合成完成后选择的匹配字符
16 compositionend
17 keyup false
为了更好的显示出按键事件,合成事件和输入事件的触发关系和时机,在 https://domeventviewer.com/key-event-viewer.html 网址上使用微软中文拼音输入法对这三类事件进行了输入测试, 检查了它们之间的触发先后关系以及事件行为的正确性:
使用微软中文拼音输入法对键盘事件,合成事件,输入事件进行测试
使用微软中文拼音输入法对键盘事件,合成事件,输入事件进行测试

5.7.7. 合成事件类型

5.7.7.1. compositionstart
类型 compositionstart
接口 CompositionEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 激活 文本合成系统 ,并启动一个新的合成会话
上下文
(可信事件)

文本合成系统 激活后, 并且新的合成会话即将开始(或已经开始,具体取决于 文本合成系统 ),准备合成一段文本时, 用户代理 必须派发此事件。此事件类型是设备依赖的 (device-dependent), 可以 依赖于文本转换系统的功能及其映射到操作系统的方式。当键盘用于馈送 (feed)输入法编辑器时,此事件类型是在 keydown 事件之后生成的, 但语音或 § 5.7.3 手写识别系统 可以 在没有键盘事件的情况下发送此事件类型。 某些实现 可以 使用文档中当前选择的文本 (用于编辑和替换)填充 compositionstart 事件的 data 属性。否则, data 属性的值 必须空字符串

此事件 必须文本合成系统 开始一个新的合成会话之前,以及由于合成过程而导致 DOM 修改之前,立即被派发。 此事件的默认行为是 文本合成系统 启动一个新的合成会话。如果此事件被取消, 文本合成系统 应当 放弃当前合成会话。

取消 compositionstart 事件类型 不等同于取消 文本合成系统 本身(例如, 通过点击一个取消按钮或关闭一个 IME 窗口)。

一些 IMEs 不支持取消正在进行的合成会话(例如, GTK目前没有这样的API)。在这些情况下,调用 preventDefault() 不会停止此事件的默认行为。

5.7.7.2. compositionupdate
类型 compositionupdate
接口 CompositionEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

文本合成系统 用新字符更新其活动文本段落(active text passage)时, 用户代理 应当 在合成会话期间派发此事件,该新字符反映在 data 包含的字符串中。

在持续与输入控件(如 <input /> )同步从而进行合成的 文本合成系统 中, compositionupdate 事件 必须 在更新控件之前被派发。(参见 § 5.7.6 合成过程中的输入事件 中事件触发顺序表格的注释)

某些 文本合成系统 可能不会向 DOM 公开此信息,在这种情况下,在合成过程中不会触发此事件。

如果合成会话被取消,则此事件将在 compositionend 之前立即触发, 并且 data 属性将设置为 空字符串

例如使用微软中文拼音输入法输入汉字,在合成会话进行时,单击 Esc 按键,关闭 IME ,同时取消合成会话,就会在 beforeinput 之后和 compositionend 之前派发 compositionupdate 事件,并且 data 属性值为 空字符串
5.7.7.3. compositionend
类型 compositionend
接口 CompositionEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

文本合成系统 完成或取消当前合成会话时, 用户代理 必须 派发此事件,并且 compositionend 事件 必须 在控件更新后调度。(参见 § 5.7.6 合成过程中的输入事件 中事件触发顺序表格的注释)

该事件在 文本合成系统 完成合成会话后立即派发(例如,IME 被关闭、最小化、 切换到焦点之外,或者以其他方式被解除并且焦点切回到 用户代理 )。

6. 键盘事件和键值

本节包含有关键盘事件的必要信息:

本节使用塞尔维亚语拉丁字母和汉字(Kanji)字符,这些字符可能在本规范的 PDF 版本或打印版本中被误传或不可用。

6.1. 键盘输入

本节内容不是规范的

每个键与整个键盘的关系有三个独立的方面, 每个方面在不同型号和配置的键盘中都有所不同,尤其是地区不同时,键盘差异更大:

本规范仅根据 key 值和 code 值定义了功能映射, 但简要描述了背景的 按键图例(key legends)

6.1.1. 按键图例

本节用于提供有用信息

按键图例是印在或浮雕在 键帽 (覆盖在键盘机械开关上的矩形"帽")上的视觉标记。 这些标记通常由一次击键时将产生的一个或多个字符组成(如 "G""8""ш" ),或指示该键功能的名称或符号(如向上的箭头 "⇧" 表示 Shift 按键,或字符串 "Enter" 表示 Enter 按键)。按键通常由该标记表示(例如, 按下 "Shift""G" 键。 )。但是,请注意,按键的视觉外观与其数字化表示无关, 在许多配置中可能完全不准确。甚至控制键和功能键(如 Enter ) 也可以映射到不同的功能,甚至可以映射为字符键。

许多键盘通常包含不产生任何字符的键,即使该按键上的符号(按键图例)可能具有 Unicode 等效符号。例如, Shift 键(键帽上)可能带有符号 "⇧" ,其 Unicode 码点为 U+21E7 ,但按下 Shift 键不会产生此字符值,并且 Shift 没有 Unicode 码点。

6.2. 键码

键码 ( code )是键盘事件的属性, 可用于识别与键盘事件相关联的物理键。它与 USB 使用 IDs 的相似之处在于, 它提供了一个与供应商无关(vendor-neutral)的底层值(类似于扫描码[scancode])。

code 属性的主要目的是提供一种一致和连贯的方法 ——根据按键的物理位置来识别按键。此外,它还提供了一个稳定的名称 (不受当前键盘状态的影响),用于唯一标识键盘上的每个键。

有效的 code 值的列表在 [UIEvents-Code] 中定义。

6.2.1. 定义 code 属性的动机

标准 PC 键盘有一组键(我们称之为 书写系统键 ), 这些键根据用户选择的当前键盘布局生成不同的 key 值。 这种情况使得编写根据键的物理位置来检测标识键的代码变得困难, 因为代码需要知道哪个键盘布局在生效,才能知道哪些 key 值要检查。现实世界中的一个例子是一款想要使用 "W""A""S""D" 键来控制玩家移动的游戏。 code 属性通过提供一个 不受当前键盘布局影响的 固定值来检查, 从而解决了这个问题。

此外, key 属性中的值也取决于当前键盘状态。因此, 被按下和释放的键相对于修饰键的顺序可能会影响存储在 key 属性中的值。 code 属性通过提供一个 不受当前键盘布局影响的 固定值来检查,从而解决了这个问题。

6.2.2. keycode 之间的关系

key
key 属性是为那些对按下的键的含义感兴趣的用户设计的, 需要考虑到当前的键盘布局(和IME; 死键被赋予一个唯一的 key 值)。使用例子: 检测修饰键或的基本的修饰键(例如, 响应键盘快捷键以执行操作)。
code
code 属性适用于对用户按下的键感兴趣的用户, 而不考虑任何布局修饰。使用例子: 检测 WASD 键(例如,用于游戏中的移动控制) 或捕获所有键(例如,在远程桌面客户端中,将所有键发送到远程主机)。

6.2.3. code 例子

以下关于键盘布局的类型,可以查阅 标准键盘布局
美式键盘布局: 标准 "101" 键盘布局;
日式键盘布局: 日式 "106" 键盘布局;
美式国际键盘布局: 备用 "101" 键盘布局;
英式键盘布局: 标准 "102" 键盘布局。
处理左右的Alt键
键盘布局 KeyboardEvent
key
KeyboardEvent
code
注释
美式 "Alt" "AltLeft" DOM_KEY_LOCATION_LEFT
法语 "Alt" "AltLeft" DOM_KEY_LOCATION_LEFT
美式 "Alt" "AltRight" DOM_KEY_LOCATION_RIGHT
法语 "AltGraph" "AltRight" DOM_KEY_LOCATION_RIGHT

在本例中,检查 key 属性允许匹配 Alt , 而不必担心按下了哪个 Alt 键 ( "AltLeft""AltRight" )。 检查 code 属性可以匹配右 Alt 键( "AltRight" ), 而无需担心当前正在使用的键盘布局。

请注意,在法语示例中, AltAltGraph 键保留其左右位置( code 值仍然是 "AltLeft""AltRight" ), 即使每个键只有一个。

处理单引号按键
键盘布局 KeyboardEvent
key
KeyboardEvent
code
注释
美式 "'" "Quote"
日式 ":" "Quote"
美式国际 "Dead" "Quote"

此示例显示了死键值是如何在属性中被编码的。 key 值根据当前区域设置而变化,而 code 属性则返回一致的值。

在各种键盘布局上处理 "2" 键(按下 Shift 键和不按下 Shift 键)。
Keyboard Layout KeyboardEvent
key
KeyboardEvent
code
注释
美式 "2" "Digit2"
美式 "@" "Digit2" shiftKey
英式 "2" "Digit2"
英式 """ "Digit2" shiftKey
法语 "é" "Digit2"
法语 "2" "Digit2" shiftKey

无论当前区域设置或修改键状态如何,在美式(US)键盘上键帽标签为 "2" 的键总是会在 code 属性中产生 "Digit2"

键盘事件序列: Shift2

比较下面列出的两个(顺序不同)按键事件序列的属性值。它们都在美国键盘上产生 "@" 字符,但按键释放的顺序不同。在第一个序列中,顺序为: Shift (按下), 2 (按下)、 2 (释放)、 Shift (释放)。

事件类型 KeyboardEvent
key
KeyboardEvent
code
注释
1 keydown "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
2 keydown "@" "Digit2" shiftKey
3 keypress "@" "Digit2" (如果支持)
4 keyup "@" "Digit2" shiftKey
5 keyup "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT

在第二个序列中, Shift2 之前释放, 从而产生以下事件顺序:Shift (按下), 2 (按下)、 Shift (释放)、 2 (释放)。

事件类型 KeyboardEvent
key
KeyboardEvent
code
注释
1 keydown "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
2 keydown "@" "Digit2" shiftKey
3 keypress "@" "Digit2" (如果支持)
4 keyup "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
5 keyup "2" "Digit2"

请注意,在 "2" 键的 keydownkeyup 事件之间的 key 属性值不匹配。 code 属性提供了一个不受当前修饰键状态影响的一致值。

6.2.4. code 和虚拟键盘

code 属性的用处对于虚拟键盘(以及遥控器和和弦键盘) 来说不太明显。通常,如果虚拟(或遥控器)键盘模仿标准键盘的布局和功能, 则它还 必须 适当地设置 code 属性。对于不模仿标准键盘布局的键盘,则 code 属性 可以 设置为标准键盘上最接近的匹配项,也 可以 未定义。

对于具有变化值特性的按键的虚拟键盘(这些按键根据某些修饰键状态产生不同的值), code 值应该是在设备处于出厂重置状态时按下按键(button) 时产生的 key 值。

6.3. 键盘事件 key 属性值

键值是一个 DOMString ,它可以用来表示(indicate) 键盘上的任何给定键,无论其位置或状态如何,通过它产生的值(来表示按键)。这些键值 可以 用作实现生成的键盘事件的返回值, 或者用作内容作者指定期望得到的输入(例如键盘快捷键)的输入值。

有效 key 值的列表在 [UIEvents-Key] 中定义。

通过使用 key 属性,键值被用于检测已按下的键的值。 内容作者可以检索大写或小写字母、数字、符号或其他产生字符的键的 字符值 ,也可以检索控制键、修饰符键、 功能键或其他不产生字符的按键的 键值 。 这些值可以用于: 监控特定的输入字符串; 用于检测和作用于结合了其他输入(例如鼠标) 的修饰键输入; 用于创建虚拟键盘; 或用于任何数量的其他目的。

键值也可以由内容作者在字符串比较中使用,能作为符合规范的 宿主语言 的标记属性 (如 HTML 的 accesskey )的值,或用于其他相关目的。符合规范的 宿主语言 应当 允许内容作者使用两个等价字符串值中的任意一个作为键值: 字符值键值

虽然独立于平台或键盘布局映射的实现将使用键的最相关值, 但内容作者不能对键盘设备生成它们的能力做出假设。 当使用键盘事件和快捷键组合的键值时,内容作者可以 考虑使用数字和功能键( F4F5 等)而不是字母 ( [DWW95] ), 因为大多数键盘布局都会为这些键值提供键。

键值并不标识(indicate)物理键盘上的特定键,也不反映打印在按键上的字符 (键帽标签)。键值表示的是: 考虑到在所有活动按键和键输入模式(包括换档模式 [shift modes] )的当前状态下的按键事件的当前值(通过 key 属性获取), 这个值反映在键盘的操作系统映射中,并报告给实现。换言之, QWERTY 键盘上键帽标签为 O 的键的键值在未换挡(unshifted)状态下具有键值 "o" ,在换挡(shifted)状态下为键值 "O" 。 由于用户可以将其键盘映射到任意自定义配置,因此鼓励内容作者不要假设键的换档 (shifted)和未换挡(unshifted)状态与字符的主要表示形式(大写或大写字母) 和次要表示形式(小写或小写字母)之间存在关系,而是鼓励内容作者使用 key 属性的值。例如, [UIEvents-Code] 中描述的标准 "102" 键盘布局阐明了一个可能的键盘布局上的一组可能的 键映射 。还有许多其他存在的键盘布局,既有标准的, 也有特殊的。

为了简化 死键 支持,当键盘的操作系统映射处理 死键 状态时,不会通过 key 属性报告死键序列的当前状态,相反,一个 "Dead" 键值会被 key 报告。取而代之的是(要获取死键序列状态),实现会生成 组合事件 ,事件中包含通过 data 属性报告的死键序列的中间状态。与前面的例子一样, QWERTY 键盘上键帽标签为 O 的键的按键值在操作死键以添加变音符号的期间,在未换挡(unshifted)状态下具有 "ö"data 属性值 ; 在操作死键以添加变音符号的期间,在换挡(shifted)状态下具有 "ö"data 属性值。

同样重要到需要注意是,按键事件状态和键值之间没有一一对应的关系。 一个特定的键值可能与多个键相关联。例如,许多标准键盘包含不止一个具有 Shift 键帽标签的键(通常通过 locationDOM_KEY_LOCATION_LEFTDOM_KEY_LOCATION_RIGHT 区分)或 8 键帽标签的键(通常由 locationDOM_KEY_LOCATION_STANDARDDOM_KEY_LOCATION_NUMPAD 区分),并且用户配置的自定义键盘布局 可以 在多个键状态(multiple key-state) 场景中复用任何键值(请注意,location 只用于标准键盘布局, 并且不总能指示出有意义的区别)。

最后,任何( key )给定的字符表示(representation) 的含义都是上下文相关的并且复杂的。例如,在某些上下文中,星号(星形)字形( "*" )表示脚注或强调(将一段文字括起来时)。然而,在一些文档或可执行程序中, 它相当于数学乘法运算,而在其他文档或可运行程序中,该功能键预留为乘法符号( "×" ,Unicode 值 U+00D7 )或小写拉丁字母 "x" (由于许多键盘上没有乘法键,而且字形 "×""x" 表面上很相似)。 这样,字符表示(representation)的语义或功能不在本规范的论述范围内。

6.3.1. 修饰符按键

关于 Modifier keys 的翻译和说明,可以参阅 修饰符按键自定义注释
关于键盘布局的相关说明,可以参阅 键盘布局自定义注释

键盘输入使用修饰键来更改键的正常行为。与其他按键一样,修饰符按键生成 keydownkeyup事件,如下面的例子所示。 某些修饰符在按键被按下或保持按下时被激活,如 AltControlShiftAltGraphMeta 。 其他修饰符会根据其状态激活,例如 CapsLockNumLockScrollLock。当按下修饰键时,(这些按键对应的修饰)状态会发生变化。 KeyboardEvent 接口为一些常见的修饰符键提供了方便的属性: ctrlKeyshiftKeyaltKeymetaKey。 某些操作系统使用 AltGraphControl 修饰键的组合来模拟 AltGraph 修饰键。鼓励实现使用 AltGraph 修饰符按键。

此示例描述了与在使用美式(US)映射的美式(US)键盘上生成的 Unicode 字符 Q (大写拉丁字母 Q ,Unicode 码点 U+0051 )相关联的可能的事件序列:
事件类型 KeyboardEvent
key
修饰符 注释
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey 大写拉丁字母 Q
3 beforeinput
4 input
5 keyup "Q" shiftKey
6 keyup "Shift"
该示例描述了上述示例的键交替序列,其中 Shift 键在 Q 键之前释放。对于 keyup 事件, Q 键的键值将恢复为其未换挡 (unshifted)的值:
事件类型 KeyboardEvent
key
修饰符 注释
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey 大写拉丁字母 Q
3 beforeinput
4 input
5 keyup "Shift"
6 keyup "q" 小写拉丁字母 Q
以下示例描述了一个可能的不生成 Unicode 字符的键序列 (使用与上上个示例相同的配置):
事件类型 KeyboardEvent
key
修饰符 注释
1 keydown "Control" ctrlKey
2 keydown "v" ctrlKey 小写拉丁字母 V
不生成 beforeinputinput 事件。
3 keyup "v" ctrlKey 小写拉丁字母 V
4 keyup "Control"
在一般的操作系统上,Ctrl + v 是粘贴的快捷组合键, 用户将剪贴板的内容粘贴到输入控件。无论剪贴板是否包含复制的内容,在 键盘事件测试网站 上测试, 谷歌浏览器 (113.0.5672.129(正式版本) (64 位))都会派发 beforeinputinput 事件,而 火狐浏览器 (113.0.2(64位))只在剪贴板有内容时才派发 beforeinputinput 事件。
当然,如果组合键的第二个按键不是 v ,而是非快捷组合按键,如 i ,则两个浏览器就如例子所述都不会触发 beforeinputinput 事件。因此,在考虑实际的事件发生情况时, 要将修饰按键和字符数字按键组合形成组合按键纳入考虑范围。
谷歌浏览器在使用 Ctrl + v 按键时,会派发data属性值为null的
					Event{beforeinput} 和 <a><code>input</code></a> 事件
谷歌浏览器在使用 Ctrl + v 按键时,会派发 datanullbeforeinputinput 事件
以下示例显示了同时按下 ShiftControl 时的事件序列:
事件类型 KeyboardEvent
key
修饰符 注释
1 keydown "Control" ctrlKey
2 keydown "Shift" ctrlKey, shiftKey
3 keydown "V" ctrlKey, shiftKey 大写拉丁字母 V
不生成 beforeinputinput 事件。
4 keyup "V" ctrlKey, shiftKey 大写拉丁字母 V
5 keyup "Shift" ctrlKey
6 keyup "Control"
这里的 beforeinputinput 事件的生成情况和例子23中的 注释 说明的情况一致,Ctrl + Shift + v 组合按键仍然有粘贴的功能。除此之外,还有考虑加入 Shift 后浏览器可能的其它快捷键对浏览器事件派发的影响,例如 Ctrl + Shift + i 组合快捷键可以打开浏览器的开发者工具(devTool),打开后可能会阻止 keyup 事件的后续派发。
对于非美式(non-US)键盘布局,事件序列相同,但键的值基于当前键盘布局。 此示例显示了使用阿拉伯键盘布局时的事件序列:
事件类型 KeyboardEvent
key
修饰符 注释
1 keydown "Control" ctrlKey
2 keydown "ر" ctrlKey 阿拉伯字母 Reh
不生成 beforeinputinput 事件。
3 keyup "ر" ctrlKey 阿拉伯字母 Reh
4 keyup "Control"

当按键按下时,触发的 keydownkeyup 事件中的值根据当前的键盘布局变化。这意味着美式布局上的 v 键和阿拉伯布局上的 ر 键将生成(具有)不同(键值)的事件, 即使它们是相同的物理键。要将这些事件标识为来自同一个物理键,您需要使用 code 属性。

在某些情况下, 修饰键 会更改键事件的 key 值。例如,在一些 MacOS 键盘上,标签为 "delete" 的键在未修饰(unmodified)时的功能与 Windows 操作系统上的 Backspace 键相同,但当被 Fn 键修饰后,它充当 Delete 键,并且 key 的值将与当前修饰符状态下按键的最合适功能相匹配。

6.3.2. 死键

死键(dead key)实际上属于修饰符按键,如下是一些参考解释:
它是电脑键盘或打字机上一种特殊的快捷键。 它们通常用来对原始的拉丁字母加上附加符号。死键并不会输出一个完整的字母, 而是改变下一个按下的键的输出结果。 因此不需要为每一个字母与每一个标音的组合都对应一个单独的键; 只要为每一个标音对应一个死键便足够。举例来说,若键盘上有一个重音符( ` )的死键,要输出法文字母 à 只需要先按下 ` ,再按下 A 。如果是 è 则是先按下 ` 再按下 E 。而通常来说,通过键入 `"Space" 可以产生一个单独的标音符号。 —— 维基百科 死键
基本上,美式标准键盘没有任何死键, 所以沿用这种键盘的中国大陆地区使用的键盘也没有死键, 但是世界上大多数地区销售的键盘都有一个 AltGraph (Alternative graphic)键,它可以直接修改一些字母,并将其他字母变成死键 (取决于键盘设置)。旧的计算机系统,如 MSX ,通常有一个标记为死键的特殊键, 它与 Ctrl 键和 Shift 键相结合, 可以用来将西欧语言中常见的一些变音符号( ´`ˆ¨ )添加到随后键入的元音中。 —— 维基百科 Dead key

一些键盘输入使用 死键 来输入合成字符序列(composed character sequences)。与在手写序列(见 § 5.7.3 手写识别系统 )中,用户可以首先输入基本字符不同,键盘输入需要在按下 死键 时进入特殊状态,并且只有在输入有限数量的 合法(legal) 基本字符中的一个时才发出(emit)字符。

MacOS 和 Linux 操作系统使用输入法来处理 死键

死键 (在所有键盘布局和映射中)由键值 "Dead" 表示。 为了响应任何死键的按下,合成事件 必须由用户代理派发,并且 compositionupdate 事件的 data 值必须是死键组合序列的当前状态的字符值。

虽然 Unicode 组合字符 总是遵循手写顺序 —— 组合字符在相应的字母后面, 但典型的死键输入 可以 颠倒顺序 ——将组合字符放在对应的字母前面。例如,单词 naïve 使用组合分音符号 (combining diacritic) ¨ ,在 Unicode (编码)中按顺序表示为 nai¨ve ,但(在输入这个单词的过程中) 可以 键入 na¨ive 。击键(keystrokes) 序列 U+0302 (组合扬抑音符(Combining Circumflex Accent)键)和 U+0065 (用小写拉丁字母 E 作为标签的键)很可能会产生 (在使用法语映射且未激活任何修饰符的法语键盘上) Unicode 字符 "ê" (带扬抑符(Circumflex)的小写拉丁字母 E ),这是 Unicode 规范化形式 (Unicode Normalization Form) NFC 的首选。

扬抑符(Circumflex, ◌̂ ),分音符(Diacritic, ◌̈), 是某些文字罗马化和音译方案所使用的拉丁字母和希腊字母的 变音符号 ,它们添加在字母上面, 或以更改字母的发音或者以区分拼写相似词语。通常而言,这些 变音符号 在各自语言的键盘布局上就是死键。在输入 Unicode 中的组合字符时,需要首先按下死键表示用户正在输入组合字符, 使用空格表示结束了组合字符的输入,而输入的字符最终会依据 Unicode 的规范化形式组合成字符串,其具体的码元可能会发生变化(见于 uievents-key-precomposed-character )
事件类型 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
注释
1 keydown "Dead" false 组合扬抑音符(死键)
2 compositionstart ""
3 compositionupdate U+0302
4 keyup "Dead" true
5 keydown "ê" true
6 compositionupdate "ê"
7 compositionend "ê"
8 keyup "e" false 小写拉丁字母 E

在第二个 keydown 事件(步骤5)中,键值(假设事件没有被阻止(suppressed)) 在正常情况下 会是 "e"(小写拉丁字母 E 键), 因为传递给用户代理的值已经被死键操作修改了(modified)。

当用户在按下一个 死键 后, 再键入一个不受支持的基本字符(即一个没有活动变音标记的基本字符)时, 此过程可能会中止:

事件类型 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
注释
1 keydown "Dead" false 组合扬抑音符(死键)
2 compositionstart ""
3 compositionupdate U+0302
4 keyup "Dead" true
5 keydown "q" true 小写拉丁字母 Q
6 compositionupdate ""
7 compositionend ""
8 keyup "q" false

6.3.3. 输入法编辑器

本规范通过 CompositionEvent 接口和事件定义了 输入法编辑器 (IMEs)的模型。但是, 组合事件和键盘事件不一定映射为一对一的关系。例如,接收 "Accept" 键值的 keydown 并不一定意味着当前在 输入法 中选择的文本正在被接受,而仅表示发生了击键并且与 输入法 的接收功能(Accept functionality,在大多数输入法系统中,这通常会导致合成事件) 断开了连接。键盘事件不能用于确定输入法编辑器的当前状态,可以通过 CompositionEvent 接口的 data 属性获取。此外, 输入法 系统和设备的功能各不相同, 其中那些用于激活这些功能的按键,例如 ConvertAccept可以 由其他可用键表示。 键盘事件就是(correspond to)输入设备在键盘布局映射之后生成的事件。

在某些实现或系统配置中,某些按键事件或其值可能会被使用中的 输入法 阻止(suppressed)。

以下示例描述了使用日语输入法生成 Unicode 字符 "市" (汉字,CJK 统一象形文字的一部分) 的可能的按键序列。 此示例假设输入法编辑器已激活并处于日语罗马字(Japanese-Romaji)输入模式。 根据使用的输入设备和 IME 的配置, ConvertAccept可以 被其他键取代,例如, 它可以分别为 U+0020 (空格键)和 Enter

"詩" (poem) 和 "市" (city) 是同音词, 发音都是 し (shi/si),因此用户需要使用 Convert 键来选择正确的选项。

事件类型 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
注释
1 keydown "s" false 小写拉丁字母 S
2 compositionstart ""
3 beforeinput
4 compositionupdate "s"
DOM 被更新了
5 input
6 keyup "s" true
7 keydown "i" true 小写拉丁字母 I
8 beforeinput
9 compositionupdate "し" shi
DOM 被更新了
10 input
11 keyup "i" true
12 keydown "Convert" true 转换键
13 beforeinput
14 compositionupdate "詩" "poem"
DOM 被更新了
15 input
16 keyup "Convert" true
17 keydown "Convert" true 转换键
18 beforeinput
19 compositionupdate "市" "city"
DOM 被更新了
20 input
21 keyup "Convert" true
22 keydown "Accept" true 接收键
23 compositionend "市"
24 keyup "Accept" false
"Convert" 键的键帽标签为 変換 ,它是 日式 "106" 键盘布局 上,位于空格按键右边的键,它用于把输入的假名转换成汉字。
"Accept" 键属于多媒体按键,接收当前选项结果或接收当前输入法序列的转换结果 。但是大多数情况下,输入法都使用 "Space" 键和 "Enter" 键来接收选择当前合成转换结果。
日语输入法存在罗马字(字母),假名,汉字三种形式的转换, 罗马字(字母)可以转换成平假名和片假名,平假名又可以转换成具体的汉字, 所以需要借助额外的 "Convert" 进行"変換"。
但是中文输入就没有日语输入那么复杂了,现代拼音输入法只有拼音(字母) 到汉字的转换过程,汉字输入的解决方案已经很成熟: 利用拼音去匹配字库和词语库中的常用汉字和词语, 通过快捷键翻页查看下一批匹配的汉字和词语, 再通过数字键或编辑键选择对应的汉字或词语, 用户的选择结果会影响汉字被匹配的优先级。 翻页查看下一批或上一批汉字的快捷键包括 PgUp PgDn< >- +[ ] ,选择匹配的汉字的按键包括字母数字区域的数字键, 和空格按键(默认第一项)。查看手写识别系统中的 拼音输入法编辑器 非规范图示可以加深对 IME 的理解。下面是通过微软拼音输入法输入 "诗" ("詩"的简体汉字)的事件触发图示:
使用微软拼音输入法输入 "诗" 时派发的事件序列
使用微软拼音输入法输入 "诗" 时派发的事件序列

IME 合成也可以像下面的例子一样被取消,输入条件与前面的例子完全相同。 根据所使用的输入设备和输入法的配置,键 Cancel 也可能被其他键取代, 例如,它可以是 U+001B (退出键,"Escape" )。

事件类型 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
注释
1 keydown "s" false 小写拉丁字母 S
2 compositionstart ""
3 compositionupdate "s"
4 keyup "s" true
5 keydown "i" true 小写拉丁字母 I
6 compositionupdate "し" shi
7 keyup "i" true
8 keydown "Convert" true 转换键
9 compositionupdate "詩" "poem"
10 keyup "Convert" true
11 keydown "Convert" true 转换键
12 compositionupdate "市" "city"
13 keyup "Convert" true
14 keydown "Cancel" true 取消键
15 compositionupdate ""
16 compositionend ""
17 keyup "Cancel" false

一些 输入法编辑器 (例如在 MacOS 操作系统上) 可能会在取消合成之前为合成事件的 data 属性设置一个 空字符串

6.3.3.1. 输入法编辑器模式按键

一些设备上的某些键用于激活 输入法编辑器 功能, 或更改活动状态 输入法编辑器 的模式。 可以为不同的设备或语言模式自定义用于上述功能的按键。 本规范中为此定义的键为: "Alphanumeric""CodeInput""FinalMode""HangulMode""HanjaMode""Hiragana""JunjaMode""KanaMode""KanjiMode""Katakana""Romaji" 。当按下这些键中的一个, 并且当前没有任何 IME 处于活动状态时, 期望在该键的指示下激活对应的 IME (如果可用)模式。 如果击键时某个 IME 已经处于活动状态,则活动状态的 IME 可能会更改为(按键)对应的模式,或者可能会启动不同的 IME ,或者也 可以 被忽略,取决于设备和具体应用程序 (application-specific)。

本规范还定义了其他键,这些键专门用于 输入法编辑器 的操作: "Accept""AllCandidates""Cancel""Convert""Compose""Zenkaku" (FullWidth), "Hankaku" (HalfWidth), "NextCandidate""Nonconvert""PreviousCandidate" 。 这些键的功能在本规范中没有定义 —— 有关 输入法编辑器 功能的详细信息,请参阅其他资源。

具有 输入法编辑器 功能的键不限于此目的(激活输入法功能, 更输入法模式),还可以具有其他特定于设备或实现的目的。

上面列出的一些与输入法有关的按键通常和使用的键盘设备有关系,可以查阅 [UIEvents-Key][UIEvents-Code] 获取更多信息。

6.3.4. 默认行为和可取消的键盘事件

取消 keydown 事件的 默认行为 不得 影响其相应的 keyup 事件,但 必须 防止生成相应的 beforeinputinput (以及 keypress ,如果支持的话)事件。 以下示例描述了在使用美式映射的美式键盘上生成 Unicode 字符 Q (大写拉丁字母Q) 的可能按键序列:

事件类型 KeyboardEvent
key
InputEvent
data
修饰符 注释
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey 默认行为 被阻止,即通过调用 preventDefault()
没有 beforeinputinput (或 keypress ,如果支持的话) 事件被生成
3 keyup "Q" shiftKey
4 keyup "Shift"

如果(被阻止的)按键是修饰符键,则在击键时仍 必须 考虑修饰符按键的状态。 以下示例描述了在使用美式映射的美式键盘上生成 Unicode 字符 Q (大写拉丁字母 Q )的可能键序列:

事件类型 KeyboardEvent
key
InputEvent
data
修饰符 注释
1 keydown "Shift" shiftKey 默认行为 被阻止,即通过调用 preventDefault()
2 keydown "Q" shiftKey
3 beforeinput "Q"
4 input
5 keyup "Q" shiftKey
6 keyup "Shift"
这个例子的结论是,被阻止的 "Shift" 不会阻止 beforeinputinput 事件的触发,并且修饰符的状态对其它字符按键仍然有影响

如果该键是多个击键(keystrokes)的序列的一部分,无论它是 死键 ,还是促成了输入法编辑器的序列,只有在 keydown 事件的 默认行为 被取消时, 该击键才 必须 被忽略(即不将其纳入考虑)。 取消 死键keyup 事件,对 beforeinputinput 事件没有影响。 以下示例使用法语键盘上的死键 "Dead" (U+0302 组合扬抑音符键)和 "e" (U+0302,小写拉丁字母 E 键),该法语键盘使用法语映射, 且未激活任何修饰键:

事件类型 KeyboardEvent
key
InputEvent
data
注释
1 keydown "Dead" 默认行为 被阻止,即通过调用 preventDefault()
2 keyup "Dead"
3 keydown "e"
4 beforeinput "e"
5 input
6 keyup "e"

7. 遗留事件的初始化器

本节是规范的。以下事件类型已过时淘汰(obsolete),只能由需要与旧版软件兼容的 用户代理 实现。

本规范的早期版本接口上包括初始化方法(例如 initMouseEvent ), 该方法需要一长串参数,在大多数情况下,这些参数并不能完全初始化事件对象的所有属性 。因此,从基本 Event 接口派生的事件接口要求显式调用 每个 派生接口的初始化器(initializer),以便完全初始化事件。

初始化 MutationEvent 的所有属性需要调用两个初始化器方法: initEventinitMutationEvent

在某种程度上,因为制定本标准的时间过长,一些实现 可以 依赖于这些(现在已弃用)初始化器方法。 为了保持规范的完整性,这些遗留事件初始化器在本附录(Appendix)中进行描述说明。

用这种方式初始化事件必须是由 createEvent() 方法创建的实例。 初始化器方法必须在事件被触发之前调用(用 dispatchEvent() 派发)。 一旦被派发,事件便不再做其他任何事。 —— MDN-initEvent

7.1. 遗留事件初始化器接口

本节是信息性的(informative)

本节介绍了本规范早期版本中引入的遗留初始化器方法(initializer methods)。

7.1.1. UIEvent 接口的初始化器

partial interface UIEvent {
  // Deprecated in this specification
  undefined initUIEvent();
};
initUIEvent()
初始化一个 UIEvent 对象的属性。此方法具有与 initEvent() 相同的行为。

initUIEvent方法已被弃用(deprecated), 但它被广泛推行的向后兼容的实现支持。

DOMString typeArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean bubblesArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean cancelableArg
有关此参数的描述,请参阅 initEvent() 方法。
Window? viewArg
指定 view 。此值可能为 null
long detailArg
指定 detail

7.1.2. MouseEvent 接口的初始化器

partial interface MouseEvent {
  // Deprecated in this specification
  undefined initMouseEvent();
};
initMouseEvent()
初始化一个 MouseEvent 对象的属性。此方法具有与 UIEvent.initUIEvent 相同的行为。

initMouseEvent方法已被弃用(deprecated), 但它被广泛推行的向后兼容的实现支持。

DOMString typeArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean bubblesArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean cancelableArg
有关此参数的描述,请参阅 initEvent() 方法。
Window? viewArg
指定 view 。此值可能为 null
long detailArg
指定 detail
long screenXArg
指定 screenX
long screenYArg
指定 screenY
long clientXArg
指定 clientX
long clientYArg
指定 clientY
boolean ctrlKeyArg
指定 ctrlKey
boolean altKeyArg
指定 altKey
boolean shiftKeyArg
指定 shiftKey
boolean metaKeyArg
指定 metaKey
short buttonArg
指定 button
EventTarget? relatedTargetArg
指定 relatedTarget 。此值 可以null

7.1.3. WheelEvent 接口的初始化器

partial interface WheelEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initWheelEvent();
};
initWheelEvent()
初始化一个 WheelEvent 对象的属性。 此方法有与 MouseEvent.initMouseEvent() 相同的行为。

initWheelEvent 方法已被弃用(deprecated)。

DOMString typeArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean bubblesArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean cancelableArg
有关此参数的描述,请参阅 initEvent() 方法。
Window? viewArg
指定 view 。此值可能为 null
long detailArg
指定 detail
long screenXArg
指定 screenX
long screenYArg
指定 screenY
long clientXArg
指定 clientX
long clientYArg
指定 clientY
short buttonArg
指定 button
EventTarget? relatedTargetArg
指定 relatedTarget 。 This value MAY be null.
DOMString modifiersListArg
要在此事件对象上激活的修饰符键值的 空白(white space) 分隔列表。 例如, "Control Shift" 将控制和换挡修饰符标记为已激活 ( 继承自 ctrlKeyshiftKey 的属性在初始化的 WheelEvent 对象上将为 true )。
double deltaXArg
指定 deltaX
double deltaYArg
指定 deltaY
double deltaZArg
指定 deltaZ
unsigned long deltaMode
指定 deltaMode

7.1.4. KeyboardEvent 接口的初始化器

遗留的 KeyboardEvent 初始化器的参数列表不包括 detailArg (存在于其他初始化器中),并添加了 locale 参数(请参见 § 12.2 用户界面事件的不同草稿(drafts)之间的更改 ); 为了与现有实现的兼容,有必要保留这种不一致性 (inconsistency)。

partial interface KeyboardEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initKeyboardEvent(DOMString typeArg,
                              optional boolean bubblesArg = false,
                              optional boolean cancelableArg = false,
                              optional Window? viewArg = null,
                              optional DOMString keyArg = "",
                              optional unsigned long locationArg = 0,
                              optional boolean ctrlKey = false,
                              optional boolean altKey = false,
                              optional boolean shiftKey = false,
                              optional boolean metaKey = false);
};
initKeyboardEvent()
初始化一个 KeyboardEvent 对象的属性。此方法具有与 UIEvent.initUIEvent 相同的行为。 The value of detail remains undefined.

initKeyboardEvent 方法已被弃用(deprecated)。

DOMString typeArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean bubblesArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean cancelableArg
有关此参数的描述,请参阅 initEvent() 方法。
Window? viewArg
指定 view 。此值可能为 null
DOMString keyArg
指定 key
unsigned long locationArg
指定 location
boolean ctrlKey
指定 Control 修饰键是否处于活动状态。
boolean altKey
指定 Alt 修饰键是否处于活动状态。
boolean shiftKey
指定 Shift 修饰键是否处于活动状态。
boolean metaKey
指定 Meta 修饰键是否处于活动状态。

7.1.5. CompositionEvent 接口的初始化器

遗留的 CompositionEvent 初始化器的参数列表不包括 detailArg (存在于其他初始化器中),并添加了 locale 参数(请参见 § 12.2 用户界面事件的不同草稿(drafts)之间的更改 ); 为了与现有实现的兼容,有必要保留这种不一致性 (inconsistency)。

partial interface CompositionEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initCompositionEvent();
};
initCompositionEvent()
初始化一个 CompositionEvent 对象的属性。此方法与 UIEvent.initUIEvent() 具有相同的行为。 detail 的值保持为 undefined

initCompositionEvent 方法已被弃用(deprecated)。

DOMString typeArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean bubblesArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean cancelableArg
有关此参数的描述,请参阅 initEvent() 方法。
Window? viewArg
指定 view 。此值可能为 null
DOMString dataArg
指定 data
DOMString locale
指定 CompositionEvent 的 locale 属性。

8. 遗留的按键事件 & 鼠标事件的属性

本节内容不是规范的。 以下属性已过时淘汰(obsolete), 只能由需要与支持这些键盘事件的旧版软件兼容的 用户代理 实现。

这些功能从未被正式定义,当前的浏览器实现也有很大的不同。 包括脚本库的大量的遗留内容,依赖于对 用户代理 进行功能检查后采取相应动作,这意味着任何将这些遗留属性和事件进行形式化 (formalize)的尝试,都存在和修复之或使之有效一样多的破坏风险。 此外,这些属性不适合国际化使用,也不涉及无障碍问题。

因此,本规范没有规范性地定义那些通常已经用于处理键盘输入的事件和属性, 尽管为了与遗留内容兼容,它们 可以 存在于 用户代理 中。作者 应当 使用 key 属性,而不是 charCodekeyCode 属性。

不管怎样,为了记录这些特性的现状及其与规范的事件和属性的关系, 本节提供了有用的信息性(informative)描述。对于支持这些属性和事件的实现, 建议使用本节中提供的定义。

8.1. 遗留的 UIEvent 补充接口

本节内容不是规范的

用户代理 传统上包括 which 属性,以便 KeyboardEventMouseEvent 事件们可以记录补充的(supplemental) 事件信息。

本规范的早期版本直接在 KeyboardEventMouseEvent 上定义了单独的 which 属性,而不是在 UIEvent 上定义共享 which 属性。

8.1.1. UIEvent 接口(补充)

部分(partial) UIEvent 接口是 UIEvent 接口的信息性扩展,它添加了 which 属性。

partial interface UIEvent {
  // The following support legacy user agents
  readonly attribute unsigned long which;
};
which, of type unsigned long, readonly
whichunsigned long 类型(32位无符号整型),只读
对于 MouseEvent 事件对象,它包含的值等于存储在 button 中的值 +1 。
对于 KeyboardEvent 事件对象, 它包含一个与系统和实现相关的数字码(numerical code), 表示与按下的键相关的未修饰(unmodified)时的标识符。在大多数情况下,该值与 keyCode 相同。

8.1.2. UIEventInit 接口(补充)

包含对 UIEvent 中的 which 支持的浏览器也应将以下成员添加到 UIEventInit 字典中。

部分(partial) UIEventInit 字典是 UIEventInit 字典的信息性扩展, 它添加了 which 以初始化对应的 UIEvent 属性成员。

partial dictionary UIEventInit {
  unsigned long which = 0;
};
which, of type unsigned long, defaulting to 0
whichunsigned long 类型(32位无符号整型),默认值为 0
初始化UIEventwhich 属性。

8.2. 遗留的 KeyboardEvent 补充接口

本节内容不是规范的

浏览器对键盘的支持在传统依赖于三个特殊(ad-hoc)属性: keyCodecharCode , 和 UIEventwhich

这三个属性都返回一个数字码,表示按下的键的某一方面(some aspect): keyCode 是键本身的索引。 charCode 是字符键的 ASCII 值。 which 是可用的字符值(同),否则是键索引 (通常和 keyCode 相同)。这些属性的值以及属性的可用性在平台、 键盘语言和布局、 用户代理 、 版本甚至事件类型之间都不一致。

事件类型之间都不一致charCode 只在遗留的 keypress 事件中有值,其它键盘事件类型中默认为 0 ,因为 keypress 只会在 DOM 发生更新时触发(即击键确定是一个字符按键, 而不是功能,修饰,菜单或其它按键),这能确保按键有对应的字符值,即 charCode 才有效。
此外,现代浏览器的 keydown 和 EVENTE{keyup} 的 keyCodewhich 属性的值总是相同(即等于键本身的索引),而在同一次击键中可能触发的 keypress 事件的 keyCodewhich 总是和 charCode 属性值相同(即等于字符键的 ASCII 值), 这就导致了一次击键中 这些属性的值 甚至在 事件类型之间都不一致 的情况。可以访问 https://domeventviewer.com/key-event-viewer.html 自己测试。

8.2.1. KeyboardEvent 接口(补充)

部分(partial) KeyboardEvent 接口是 KeyboardEvent 接口的信息性 (informative)扩展,它添加了 charCodekeyCode 属性。

部分(partial) KeyboardEvent 接口可以通过在支持此扩展的实现中调用 createEvent() 方法调获得(obtained)。

partial interface KeyboardEvent {
  // The following support legacy user agents
  readonly attribute unsigned long charCode;
  readonly attribute unsigned long keyCode;
};
charCode, of type unsigned long, readonly
charCodeunsigned long 类型(32位无符号整型),只读
charCode 保存一个字符值,在字符输入触发的 keypress 事件中有效。该值是该字符的 Unicode 参考数字 (code point,码点)(即对于可打印(printable)字符,event.charCode = event.key.charCodeAt(0) )。对于 keydownkeyup 事件, charCode 的值为 0
keyCode, of type unsigned long, readonly
keyCode 保存一个与系统和实现相关的数字码(numerical code),表示与按下的键相关的未修饰(unmodified)时的标识符。与 key 属性不同,该属性值的集合在本规范中没有规范化的定义 。通常, keyCode 的这些值 应当 代表 ASCII [RFC20] [US-ASCII] 或 Windows 1252 [WIN1252] 中的十进制码点(codepoint),但 可以 从不同的合适字符集中提取。 如果实现无法识别键(的 keyCode ),则使用值 0

参见 § 8.3 遗留按键模型 获取更多详细信息,以了解如何确定 keyCode 的值。

8.2.2. KeyboardEventInit 接口(补充)

包含对 KeyboardEvent 中的 keyCodecharCode 支持的浏览器也应将以下成员添加到 KeyboardEventInit 字典中。

部分(partial) KeyboardEventInit 字典是 KeyboardEventInit 字典的信息性扩展,它添加了 charCodekeyCode 以初始化对应的 KeyboardEvent 属性成员。

partial dictionary KeyboardEventInit {
  // The following support legacy user agents
  unsigned long charCode = 0;
  unsigned long keyCode = 0;
};
charCode, of type unsigned long, defaulting to 0
charCodeunsigned long 类型(32位无符号整型),默认值为 0
KeyboardEventcharCode 属性初始化为事件字符的 Unicode 码点(code point)。 character.
keyCode, of type unsigned long, defaulting to 0
keyCodeunsigned long 类型(32位无符号整型),默认值为 0
KeyboardEventkeyCode 属性初始化为与系统和实现相关的数字码(numerical code), 它表示与按下的键相关的未修饰(unmodified)时的标识符。

8.3. 遗留按键模型

本节内容不是规范的

对于不同的事件类型,不同实现选择暴露(exposed)出的事件属性的值会有区别。 实现 可以 选择在 keyCode 属性中公开虚拟键码(key codes)和字符码(character codes)(即 合并模型 (conflated model) ),或者报告单独的 keyCodecharCode 属性(即 拆分模型(split model) )。

8.3.1. 如何确定 keydownkeyup 事件的 keyCode

keydownkeyup 事件的 keyCode 计算方式如下:

8.3.2. 如何确定 keypress 事件的 keyCode

keypress 事件的 keyCode 计算方式如下:

现代浏览器大多是第一种情况,即 keypress 事件的 keyCode 值和 charCode 一致, 为输入字符的 Unicode 码点。

8.3.3. 固定虚拟键码

以下键的虚拟键码通常不会随桌面系统上的键盘布局而更改:

虚拟键码 注释
Backspace 8
Tab 9
Enter 13
Shift 16
Control 17
Alt 18
CapsLock 20
Escape 27 Esc
Space 32
PageUp 33
PageDown 34
End 35
Home 36
ArrowLeft 37
ArrowUp 38
ArrowRight 39
ArrowDown 40
Delete 46 Del

8.3.4. 可选的固定虚拟键码

以下标点符号的虚拟键码 可以 在不同键盘布局之间不同,但报告的这些值很可能会更兼容于某些遗留内容, 这些遗留内容预期使用美式英语键盘布局:

字符 虚拟键码
Semicolon ";" 186
Colon ":" 186
Equals sign "=" 187
Plus "+" 187
Comma "," 188
Less than sign "<" 188
Minus "-" 189
Underscore "_" 189
Period "." 190
Greater than sign ">" 190
Forward slash "/" 191
Question mark "?" 191
Backtick "`" 192
Tilde "~" 192
Opening squace bracket "[" 219
Opening curly brace "{" 219
Backslash "\" 220
Pipe "|" 220
Closing square bracket "]" 221
Closing curly brace "}" 221
Single quote "'" 222
Double quote """ 222

9. 遗留事件类型

本节是规范的。以下事件类型已过时淘汰(obsolete),只能由需要与旧版软件兼容的 用户代理 实现。

本节的目的是记录这些(遗留)特性的现状及其与规范事件的关系。 对于支持这些(遗留)事件的实现,建议使用本节中提供的定义。

下表提供了本规范中不推荐使用的事件类型的信息概要。 它们被整理在这里是为了(规范的)参考引用和完整性。

事件类型 同步 / 异步 冒泡 阶段 可信事件目标 类型 DOM 接口 可取消 默认行为 能否从Shadow DOM冒泡传递 默认行为
DOMActivate 同步 冒泡 Element UIEvent 没有
DOMAttrModified 同步 冒泡 Element MutationEvent 不能 不能 没有
DOMCharacterDataModified 同步 冒泡 Text, Comment, ProcessingInstruction MutationEvent 不能 不能 没有
DOMFocusIn 同步 冒泡 Window, Element FocusEvent 不能 没有
DOMFocusOut 同步 冒泡 Window, Element FocusEvent 不能 没有
DOMNodeInserted 同步 冒泡 Element, Attr, Text, Comment, DocumentType, ProcessingInstruction MutationEvent 不能 不能 没有
DOMNodeInsertedIntoDocument 同步 不冒泡 Element, Attr, Text, Comment, DocumentType, ProcessingInstruction MutationEvent 不能 不能 没有
DOMNodeRemoved 同步 冒泡 Element, Attr, Text, Comment, DocumentType, ProcessingInstruction MutationEvent 不能 不能 没有
DOMNodeRemovedFromDocument 同步 不冒泡 Element, Attr, Text, Comment, DocumentType, ProcessingInstruction MutationEvent 不能 不能 没有
DOMSubtreeModified 同步 冒泡 Window, Document, DocumentFragment, Element, Attr MutationEvent 不能 不能 没有
keypress 同步 冒泡 Element KeyboardEvent 多种: 启动 文本合成系统; (触发) blurfocus 事件; (触发) DOMActivate 事件; (触发)其它事件

9.1. 遗留 UIEvent 事件

9.1.1. 遗留 UIEvent 事件类型

9.1.1.1. DOMActivate
类型 DOMActivate
接口 UIEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当按钮、链接或其他状态可更改的元素被激活时, 用户代理 必须 派发此事件。查阅 § 3.5 激活触发器和行为 以获取更多详细信息。

为了(规范的)参考引用和完整性,本规范中定义了 DOMActivate 事件类型 ,但本规范 反对(deprecates) 使用此事件类型, 而赞成使用相关的 click 事件类型。为了向后兼容,其他规范 可以 定义并维护自己的DOMActivate 事件类型

虽然 DOMActivateclick 并不完全等同,但 click 事件类型的实现行为已经发展到包括 DOMActivate 事件类型 设计时考虑的最关键的无障碍 (accessibility)方面,并得到了更广泛的实现。鼓励内容作者使用 click 事件类型,而不是相关的 mousedownmouseup 事件类型, 以确保最大程度的可访问性(accessibility)。

支持 DOMActivate 事件类型 的实现还 应当DOMActivate 作为与 激活触发器 关联的 click 事件的 默认行为 进行派发。然而,对于 激活触发器 的关联的任何事件, 这样的实现 应当 只启动一次相关的 激活行为

经过测试,不同浏览器对于触发 DOMActivate 遗留事件的行为不一样, 例如在点击a标签链接时,会在a元素上派发 click 事件,连带其默认行为执行 ,火狐浏览器(113.0.2 64位)中连带的默认行为包括触发 DOMActivate 事件, 而谷歌浏览器(114.0.5735.91(正式版本) (64 位))并不包含。测试例子见 DOMActivate and Click

XForms [XFORMS11] 必须 支持 DOMActivate 事件类型 ,它预定用 宿主语言 实现。 如果用插件或基于脚本的 XForms 实现要安装在符合本规范的不支持 DOMActivate 事件类型 规定的原生实现中, XForms 用户代理 必须根据合适的 激活触发器 合成(synthesize)并派发自己的 DOMActivate 事件。

因此,当 click 事件由符合用户界面事件规范的 用户代理 派发时, XForms 用户代理 必须确定是否合成具有与该 click 事件的 默认行为 的相关属性相同的 DOMActivate 事件。适当的提示(Appropriate cues,指 click 事件的属性)可能有 click 事件是否 可信 ,或者其 事件目标 是否注册了 DOMActivate事件侦听器

不要在许多 用户代理 中依赖 DOMActivate 的协作(interoperable)支持。相反,应该使用 click 事件类型 ,因为它被广泛的实现支持, 并提供更容易访问的(accessible)行为。

此规范中反对(deprecated)使用 DOMActivate 事件类型

9.1.2. 激活(Activation)事件顺序

如果 用户代理 支持 DOMActivate 事件,则 必须 按以下相对于彼此的固定顺序被派发: (仅列出有关(pertinent)事件): 默认行为

事件类型 注释
1 click
2 DOMActivate 如果 用户代理 支持 (此事件),(则作为 click 事件的) 默认行为 (被派发); 合成的; isTrusted="true"
3 所有其它( click 事件的) 默认行为 ,包括 激活行为

如果焦点元素是被按键事件激活的,则以下显示了典型的事件序列 (仅列出有关(pertinent)事件):

事件类型 注释
1 keydown 必须 是可以激活元素的键,例如 Enter   (空格)键,或者元素未被激活
2 click (作为 keydown 事件的) 默认行为 (被派发); 合成的; isTrusted="true"
3 DOMActivate 如果 用户代理 支持 (此事件),(则作为 click 事件的) 默认行为 (被派发); 合成的; isTrusted="true"
4 所有其它( click 事件的) 默认行为 ,包括 激活行为
关于 DOMActivate 在现代浏览器中的支持行为,可以查阅 DOMActivate 事件介绍中的 非规范注释 , 其中包含一个测试地址可以验证本节事件序列的正确性。

9.2. 遗留 FocusEvent 事件

9.2.1. 遗留 FocusEvent 事件类型

9.2.1.1. DOMFocusIn
类型 DOMFocusIn
接口 FocusEvent
同步 / 异步 同步
冒泡
可信目标对象 Window, Element
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

事件对象 接收焦点时 用户代理 必须 派发此事件。 事件对象 必须 在此事件类型被派发前接收焦点 此事件类型 必须focus 事件类型之后被派发。

为了(规范的)参考引用和完整性,本规范中定义了 DOMFocusIn 事件类型 ,但本规范 反对(deprecates) 使用此事件类型, 而赞成使用相关的 focusfocusin 事件类型。

9.2.1.2. DOMFocusOut
类型 DOMFocusOut
接口 FocusEvent
同步 / 异步 同步
冒泡
可信目标对象 Window, Element
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

事件对象 失去焦点时, 用户代理 必须 派发此事件。焦点 必须 在派发此事件之前从 事件对象 上丢失(taken)。此事件类型 必须blur 事件类型之后被派发。

为了(规范的)参考引用和完整性,本规范中定义了 DOMFocusOut 事件类型 ,但本规范 反对(deprecates) 使用此事件类型, 而赞成使用相关的 blurfocusout 事件类型。

9.2.2. 遗留焦点事件(FocusEvent)事件顺序

以下是焦点在元素之间转移时的典型事件序列,包括不推荐使用的 DOMFocusInDOMFocusOut 事件。所示的顺序假定最初没有元素被聚焦。

这里的顺序是 focusin => focus => DOMFocusIn , 这种顺序在现代浏览器测试中是 错误的 ,并且不符合正式规范的 § 5.2.2 焦点事件顺序 中的描述。
实际上 源项目 在 2023 年 3 月 10 号在 main 和 gh-pages 分支上合入了一个名称为 Reflect the reality for the focus event order 的合入请求, 该分支请求指出了 event-types 文件(事件类型区域内容) 中有关焦点事件顺序的错误,并将其更正为正确形式,只不过在本(遗留事件类型) 区域没有进行更改。
🚫 事件类型 注释
用户转移焦点
1 focusin 在第一个目标元素接收焦点之前发送
2 focus 在第一个目标元素收到焦点后发送
3 DOMFocusIn 如果支持(才派发此事件)
用户转移焦点
4 focusout 在第一个目标元素失去焦点之前发送
5 focusin 在第二个目标元素接收焦点之前发送
6 blur 在第一个目标元素失去焦点后发送
7 DOMFocusOut 如果支持(才派发此事件)
8 focus 在第二个目标元素接收焦点后发送
9 DOMFocusIn 如果支持(才派发此事件)
为了帮助理解增加遗留焦点事件后,焦点事件触发的顺序, 下面自定义了一个在实际实现上的焦点事件触发顺序表,测试网站为 https://domeventviewer.com/focus-event-viewer.html 。其中, 经过测试可以知晓的是火狐浏览器(113.0.2 64位)在用户转移焦点时已经不会触发 DOMFocusInDOMFocusOut 事件了,而谷歌浏览器(114.0.5735.91 (正式版本) (64 位))可以正常触发。
✅非规范表格 事件类型 注释
用户转移焦点
1 focus 在第一个目标元素接收焦点之后发送
2 focusin 紧随 focus 事件发送
3 DOMFocusIn 如果支持(才派发此事件)
用户转移焦点
4 blur 在第一个目标元素失去焦点之后发送
5 focusout 紧随 blur 事件发送
6 DOMFocusOut 如果支持(才派发此事件)
7 focus 在第二个目标元素接收焦点后发送
8 focusin 紧随 focus 事件发送
9 DOMFocusIn 如果支持(才派发此事件)

9.3. 遗留 KeyboardEvent 事件

keypress 事件是一种,用于捕获按键事件并在按键按下导致的 DOM 更新效果作用之前对其进行处理的,传统方式。使用 keypress 事件的代码通常依赖于遗留的 charCodekeyCodewhich 属性。

请注意, keypress 事件是特定于按键事件的,并且已被 beforeinputinput 事件的更通用的事件序列所取代(见 § 5.6.3 键盘事件顺序 )。这些新的 input 事件不是特定于键盘操作的,并且可以用于捕获用户输入,而不管原始(触发)源是什么。

个人理解,使用 beforeinputinput 代替键盘事件顺序中的 keypress 相当于一种脱离硬件的抽象,它能更好的对虚拟键盘进行处理。

9.3.1. 遗留 KeyboardEvent 事件类型

9.3.1.1. keypress
类型 keypress
接口 KeyboardEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 多种: 启动 文本合成系统; (触发) blurfocus 事件; (触发) DOMActivate 事件; (触发)其它事件
上下文
(可信事件)

如果 用户代理 支持,并且当且仅当该键能正常产生 字符值 时,则 必须 在按下这个键时派发此事件。 keypress 事件类型是依赖设备的, 取决于输入设备的功能以及它们在操作系统中的映射方式。

此事件类型 必须键映射 之后生成。使用 输入法编辑器 时, 不得 派发它。

如果取消此事件,除了取消 默认行为 外, 还应阻止 input 事件的触发。

作者 应当 使用 beforeinput 事件而不是遗留的 keypress 事件。

传统上, keypress 事件与能检测到 字符值 的按键而非一个物理键相关联, 并且在某些配置中可能不适用于所有键。

为了(规范的)参考引用和完整性,本规范中定义了 keypress 事件类型, 但本规范 反对(deprecates) 使用此事件类型。 在编辑上下文时,作者可以转而使用 beforeinput 事件替代( keypress )。

9.3.2. keypress 事件顺序

keypress 事件类型 必须keydown 事件之后并且与同一个按键关联的 keyup 事件之前被派发。

keypress 事件类型 必须beforeinput 事件之后并且与同一个按键关联的 input 事件之前被派发。

以下示例演示了支持 keypress 事件的用户代理们的按键事件序列:

事件类型 KeyboardEvent
key
InputEvent
data
注释
1 keydown "a"
2 beforeinput "a"
3 keypress "a"
与该键相关的任何 默认行为 , 例如在 DOM 中插入字符。
4 input
5 keyup "a"

9.4. 遗留 MutationEvent 事件

Mutation 在英语中意为突变,在前端领域,它常被指为 DOM 元素所经历的变化或渲染的 DOM 元素的状态的变化,MutationObserver 的出现取代了废弃的 MutationEvent 事件。

突变和名为突变的事件模块旨在允许文档结构的任何更改进行通知,包括属性、 文本或名称的修改(modifications)。

MutationEvent 接口关联的任何事件类型都指定为不可取消。 这源于这样一个事实,即如果因(突变)而发生的事件(resulting event)的取消性 (cancelation)决定文档变化的可能的发生或不发生, 那么很难使用现有的会导致文档变动(modifications)的 DOM 接口。 尽管这仍然是一种希望实现的(desired)功能,但决定将其剩余(left)会更好, 除非将事务添加到 DOM 中(until the addition of transactions into the DOM)。

DOM 树的许多单个修改(modifications)可以导致多个突变事件被派发。 与其努力去指定由于树的每一次可能的修改而导致的一系列突变事件的顺序, 不如将这些事件的顺序留给实现(去自己决定)。

MutationEvent 接口是在 DOM Level 2 Events 中引入的, 但尚未在所有 用户代理 上被完全且可互用地 (interoperably)被实现。此外,也有人批评接口的设计带来了性能和实现方面的挑战 (非规范补充: 这也是后来遗弃 MutationEvent 而引入 MutationObserver 的原因之一)。

DOM4 [DOM] 提供了一种使用 MutationObserver 接口的新机制, 该接口以更高性能的方式解决了突变事件处理(solve)的用例。因此, 本规范描述了突变事件是为了保证遗留行为的参考引用和完整性, 但 反对(deprecates) 使用 MutationEvent 接口。

9.4.1. MutationEvent 接口

在 DOM Level 2中引入介绍,但在本规范中已被弃用

MutationEvent 接口提供与突变事件(Mutation events) 相关的特定上下文信息。

要创建 MutationEvent 接口的实例,调用 createEvent() 方法。

interface MutationEvent : Event {
  // 属性更改类型(attrChangeType)
  const unsigned short MODIFICATION = 1;
  const unsigned short ADDITION = 2;
  const unsigned short REMOVAL = 3;

  readonly attribute Node? relatedNode;
  readonly attribute DOMString prevValue;
  readonly attribute DOMString newValue;
  readonly attribute DOMString attrName;
  readonly attribute unsigned short attrChange;

  undefined initMutationEvent();
};
MODIFICATION
Attr 已修改到位(in place)。
ADDITION
Attr 刚刚被添加。
REMOVAL
Attr 刚刚被移除。
relatedNode, of type Node, readonly, nullable
relatedNodeNode 类型,只读,可为空
relatedNode 必须 用于标识与突变事件相关的次级(secondary)节点。例如, 如果一个突变事件被派发到一个节点,指示其父节点已经更改了,那么 relatedNode 将是更改了的父节点。 如果一个事件被派发到了一个子树,指示其中的一个节点发生了更改,那么 relatedNode 必须 是那个更改了的节点。在派发的事件是 DOMAttrModified 的情况下, 它指示被修改、添加或删除的 Attr 节点。 该属性的 未初始化值 该属性的 未初始化值 必须null
prevValue, of type DOMString, readonly
prevValueDOMString 类型,只读
prevValue 表示 DOMAttrModified 事件中的 Attr 节点的上一个值和 DOMCharacterDataModified 事件中的 CharacterData 节点的上一个值。

该属性的 未初始化值 必须"" (空字符串)。

newValue, of type DOMString, readonly
newValue 表示 DOMAttrModified 事件中的 code>Attr 节点的新值,以及 DOMCharacterDataModified 事件中的 CharacterData 节点的新值。

该属性的 未初始化值 必须"" (空字符串)。

attrName, of type DOMString, readonly
attrName 表示 DOMAttrModified 事件中更改了的 Attr 节点的名称。

该属性的 未初始化值 必须"" (空字符串)。

attrChange, of type unsigned short, readonly
attrChange 表示触发的(triggered) DOMAttrModified 事件的更改类型。这些值可以是 MODIFICATIONADDITIONREMOVAL

该属性的 未初始化值 必须0

没有为 attrChange (未初始化值)定义常量值 0 。

initMutationEvent()
初始化 MutationEvent 对象的属性。此方法具有与 initEvent() 相同的行为。
DOMString typeArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean bubblesArg
有关此参数的描述,请参阅 initEvent() 方法。
boolean cancelableArg
有关此参数的描述,请参阅 initEvent() 方法。
Node? relatedNodeArg
指定 MutationEvent.relatedNode
DOMString prevValueArg

指定 MutationEvent.prevValue 。此值 可以空字符串

DOMString newValueArg
指定 MutationEvent.newValue 。 此值 可以空字符串
DOMString attrNameArg
指定 MutationEvent.attrName 。 此值 可以空字符串
unsigned short attrChangeArg
指定 MutationEvent.attrChange. 此值 可以0

9.4.2. 遗留 MutationEvent 事件类型

突变事件类型如下所示。

9.4.2.1. DOMAttrModified
类型 DOMAttrModified
接口 MutationEvent
同步 / 异步 同步
冒泡
可信目标对象 Element
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)
  • Event.target : 属性正在被修改的元素
  • MutationEvent.attrName : 更改了的 Attr 节点的名称
  • MutationEvent.attrChange : 最匹配的 attrChangeType 对应的数字码
  • MutationEvent.relatedNode : 被修改、添加或删除的 Attr 节点。
  • MutationEvent.newValue : 如果 Attr 节点已被添加或修改,则表示属性的新值。
  • MutationEvent.prevValue : 如果 Attr 节点已被删除或修改,则表示属性的上一个值。

在修改了一个 ElementAttr.value 之后以及在一个 Element 上添加或删除一个 Attr 节点之后 用户代理 必须 派发此事件。 事件的 事件对象 必须 是发生了改变的 Element 节点。当 Attr 节点的子节点以不影响 Attr.value 值的方式更改时,是否会发生此事件类型取决于实现。

为了(规范的)参考引用和完整性,本规范中定义了 DOMAttrModified 事件类型 ,但本规范 反对(deprecates) 使用此事件类型。

9.4.2.2. DOMCharacterDataModified
类型 DOMCharacterDataModified
接口 MutationEvent
同步 / 异步 同步
冒泡
可信目标对象 Text, Comment, ProcessingInstruction
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

修改 CharacterData.dataProcessingInstruction.data 之后, 但节点本身尚未被插入或删除之前 用户代理 必须 派发此事件。这个事件的 事件对象 必须CharacterData 节点或者 ProcessingInstruction 节点。

为了(规范的)参考引用和完整性,本规范中定义了 DOMCharacterDataModified 事件类型 , 但本规范 反对(deprecates) 使用此事件类型。

9.4.2.3. DOMNodeInserted
类型 DOMNodeInserted
接口 MutationEvent
同步 / 异步 同步
冒泡
可信目标对象 Element, Attr, Text, Comment, DocumentType, ProcessingInstruction
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当除了 Attr 节点之外的节点被添加为另一个节点的子节点时。 用户代理 必须 派发此事件类型。当 Attr 节点已添加到一个 Element 节点时,用户代理 可以 派发此事件(请参阅下面的 注释 )。 此事件 必须 在插入发生后被派发。 事件的事件对象 必须 是要被插入的节点。

要检测属性插入,请改用 DOMAttrModified 事件类型。

为了(规范的)参考引用和完整性,本规范中定义了 DOMNodeInserted 事件类型 ,但本规范 反对(deprecates) 使用此事件类型。

9.4.2.4. DOMNodeInsertedIntoDocument
类型 DOMNodeInsertedIntoDocument
接口 MutationEvent
同步 / 异步 同步
冒泡
可信目标对象 Element, Attr, Text, Comment, DocumentType, ProcessingInstruction
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当一个节点被插入到文档中时(可以直接插入该节点,也可以插入包含该节点的子树) , 用户代理 必须 派发此事件。 用户代理 可以将 Attr 节点视为一个 Element 子树的一部分。此事件 必须 在插入发生后被派发。事件的 事件对象 必须 在插入发生后被派发。 如果节点被直接插入, DOMNodeInserted 事件类型 必须 在此( DOMNodeInsertedIntoDocument )事件类型发生之前被派发。

为了(规范的)参考引用和完整性,本规范中定义了 DOMNodeInsertedIntoDocument 事件类型 ,但本规范 反对(deprecates) 使用此事件类型。

9.4.2.5. DOMNodeRemoved
类型 DOMNodeRemoved
接口 MutationEvent
同步 / 异步 同步
冒泡
可信目标对象 Element, Attr, Text, Comment, DocumentType, ProcessingInstruction
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

当从其父节点删除一个除了 Attr 节点以外的节点时, 用户代理 必须 派发此事件。当 Attr 节点被它自己的 ownerElement 节点删除时,用户代理 可以 派发此事件(请参阅下面的 注释 )。 此事件 必须 在移除(removal)发生之前被派发。 事件的 事件对象 必须 是要被删除的节点。

要可靠地检测属性的移除(removal),请改用 DOMAttrModified 事件类型。

为了(规范的)参考引用和完整性,本规范中定义了 DOMNodeRemoved 事件类型 ,但本规范 反对(deprecates) 使用此事件类型。

9.4.2.6. DOMNodeRemovedFromDocument
类型 DOMNodeRemovedFromDocument
接口 MutationEvent
同步 / 异步 同步
冒泡
可信目标对象 Element, Attr, Text, Comment, DocumentType, ProcessingInstruction
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

从一个节点在文档中被删除时(可以直接删除该节点,也可以删除包含该节点的子树) , 用户代理 必须 派发此事件。 用户代理 可以Attr 节点视为一个 Element 子树的一部分。此事件 必须 在移除(removal)发生之前被派发。事件的 事件对象 必须 是要被删除的节点。如果节点被直接删除, DOMNodeRemoved 事件类型 必须 在此( DOMNodeRemovedFromDocument )事件类型之前被派发。

要可靠地检测属性的移除(removal),请改用 DOMAttrModified 事件类型。

为了(规范的)参考引用和完整性,本规范中定义了 DOMNodeRemovedFromDocument 事件类型 , 但本规范 反对(deprecates) 使用此事件类型。

9.4.2.7. DOMSubtreeModified
类型 DOMSubtreeModified
接口 MutationEvent
同步 / 异步 同步
冒泡
可信目标对象 Window, Document, DocumentFragment, Element, Attr
可取消
默认行为
能否从Shadow
DOM冒泡传递
默认行为 没有
上下文
(可信事件)

这是一个用于通知文档的所有更改的常规事件。 它可以用来代替更具体的突变(mutation)和名为突变的事件。 它 可以 在对文件进行一次修改(modification) 后被派发,也可以在发生多次更改后由实现自行决定派发。后一种情况通常 应当 应用于适应(accommodate) 同时或快速连续发生多个变化的情况。此事件的目标 必须 是已发生的更改的最底层公共父级。 此事件 必须 在突变(mutation(s)) 引起的任何其他(突变)事件发生后被派发。

为了(规范的)参考引用和完整性,本规范中定义了 DOMSubtreeModified 事件类型 ,但本规范 反对(deprecates) 使用此事件类型。

10. 扩展事件

本节内容不是规范的

10.1. 简介

本规范定义了数个接口和许多事件,但是,这并不是一组适用所有功能(purposes) 而面面俱到的(exhaustive)事件集合。为了允许内容作者和实现者添加期望的功能 (desired functionality),本规范提供了两种机制来扩展这组接口和事件, 并且不会产生冲突: 自定义事件/a> 和 实现特定 (implementation-specific)的扩展

10.2. 自定义事件

脚本作者 可以 用对应用程序结构(architecture) 有意义的事件类型来定义功能组件(functional components)方面的应用程序。 内容作者可以使用 CustomEvent 接口创建自己的事件, 这些事件适用于(appropriate to)他们正在使用的抽象(abstraction)层次。

内容作者可能创建了一个应用程序,该应用程序具有动态生成的条形图(bar chart)。 此条形图应每 5 分钟更新一次,或者当订阅源(feed)显示新信息时, 或者当用户单击按钮手动刷新时(会额外更新)。当需要更新图表时, 必须调用数个处理程序(handlers): 应用程序必须获取最新数据, 向用户显示事件正在更新的图标,并重建图表。要对此进行控制, 内容作者可以选择创建一个自定义的 updateChart 事件, 只要满足以上触发(trigger)条件之一,就会触发该事件:
var chartData = ...;
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent( "updateChart", true, false, { data: chartData });
document.documentElement.dispatchEvent(evt);

10.3. 实现特定(implementation-specific) 的扩展

当一个新事件正在设计和原型化(prototyped)时,或者当一个事件旨在实现特定的功能 (implementation-specific functionality)时,最好将其与标准化事件区分开来。 实现 应当 用一个短字符串作为特定于(specific) 其实现的事件类型的前缀,以将其与其他实现中的同一事件以及标准化事件区分开来。 这类似于 CSS 中的 供应商特定的(vendor-specific) 关键字前缀 ,可是没有像 CSS 一样使用破折号( "-" ),因为在 Javascript 中(破折号)用作属性名称时可能会导致问题。

一个讲究的浏览器供应商 FooCorp 预期希望推出一个新的事件 jump 。这家供应商在他们的浏览器中实现了 fooJump ,使用他们的供应商特定的前缀: "foo" 。早期(新技术)应用者开始使用 someElement.addEventListener("fooJump", doJump, false) 来试验该事件,并向 FooCorp 提供反馈, FooCorp 会相应地更改 fooJump 的行为。

一段时间后,另一家供应商 BarOrg 决定他们也想要该功能, 但实现方式略有不同,因此他们在事件类型名称中使用自己的供应商特定的前缀 "bar": barJump 。 试验此版本的 jump 事件类型的内容作者使用 BarOrg 的事件类型名称注册事件。希望编写适用于两种浏览器的代码的内容作者, 可以使用特定的事件处理程序分别注册每个事件类型, 也可以使用同一个事件处理程序并根据事件类型的名称执行不同的操作。因此, 不同代码库中的早期试验不会发生冲突,并且早期(新技术) 应用者能够为多个实现编写易于维护(easily-maintained)的代码。

最终,随着功能的成熟,两种浏览器的行为都会稳定下来, 并可能会因为内容作者和用户的反馈或通过正式的标准化而趋同。 随着这种稳定化的发生,冲突的风险降低,内容作者可以删除分叉(forked)代码, 并使用相同的事件处理程序和更通用的注册方法 someElement.addEventListener( "jump", doJump, false) (甚至在正式标准化之前)去使用 jump 事件类型名称。

10.3.1. 已知的实现特定的前缀

在撰写本规范时,已知存在以下事件类型名称前缀:

前缀 引擎内核 供应商(Organization)
moz, Moz Gecko Mozilla
ms, MS Trident Microsoft
o, O Presto Opera Software
webkit WebKit Apple, Google, others
需要说明的是,浏览器事件目前(2023年6月12日)已经趋同, 已经很少见到实现特定的扩展事件了,原始规范的 在撰写本文时 的 github 提交的记录信息是 Gary Kacmarcik, 7年前 (3 5th, 2016 1:56 凌晨) 。不过这个表格中的前缀列对老版本浏览器的实现特定的 CSS 属性前缀的使用理解有帮助。

11. 安全注意事项

本附录讨论了用户界面事件实现的安全注意事项。 讨论仅限于由本规范中定义的概念可能直接引起的安全问题,这些概念包括事件模型的实现 、APIs 和事件。实现(Implementations)通常支持其他功能,如脚本语言、其他 APIs 和本文档中未定义的其他事件。这些功能构成不可预知的要素,超出了本规范的范围。 实现人员 应当 查阅上述种种功能的规范, 以了解其各自的安全注意事项。

本规范中定义的许多事件类型都是响应用户操作而被派发的。 这使得恶意 事件监听器 能够访问用户通常认为是隐私 (confidential)的信息,例如,用户在填写表单时可能犯的拼写错误, 如果用户在提交表单前不久重新考虑对多选问题的回答,用户的打字率或主要输入机制。 在最坏的情况下,恶意 事件监听器 可以捕获所有用户交互,并通过 DOM 实现中通常可用的方法(如 XMLHttpRequest 接口, 本规范未定义这些方法)将其提交给第三方。

在支持加载外部数据的设备(facilities)的 DOM 实现中,像 error 这样的事件可以提供对关于计算机系统或网络的环境相关的敏感信息的访问。 例如,一个恶意 HTML 文档试企图将资源嵌入本地网络或本地主机的不同端口。 然后,嵌入式 DOM 应用程序 可以监听 errorload 事件, 以确定网络中的哪些其他计算机可以从本地系统访问,或者系统上的哪些端口是打开的, 从而为进一步的攻击做好准备。

仅支持用户界面事件的实现通常不足以执行此类攻击, 并且可能支持此类攻击的设备的安全注意事项也适用。为了符合本规范, DOM 实现 可以 采取合理的步骤来确保 DOM 应用程序 不会访问隐私或敏感信息。例如, 它们可能会选择不将 load 事件分派发给企图在本地网络上嵌入资源的节点。

12. 变化

12.1. 从 DOM Level 2 Events 到 UI Events 的更改

(本规范)已经对接口和事件类型进行了大量分类(clarifications)。 本规范文档中不再定义 HTMLEvents 模块。 focusblur 事件已添加到 UIEvent 模块, dblclick 事件已添加至 MouseEvent 模块。本新规范在 DOM 事件流、事件类型和 DOM 接口之间提供了更好的分隔(separation)。

12.1.1. 对 DOM Level 2 事件流的更改

本新规范在事件流中引入了以下新概念:

12.1.2. 对 DOM Level 2 事件类型的更改

(本规范)已经对事件类型进行了大量分类(clarifications)。一致性(conformance) 现在是针对事件类型明确定义的,而不仅仅是根据事件类型使用的接口。

"MutationEvents" 已被遗弃。在本规范的早期草案中, 对命名空间事件(namespaced events)的支持也被删除了。

对于支持 DOMNodeInsertedDOMNodeRemoved 事件类型的用户代理 ,此规范不再要求为 Attr 节点触发此事件类型。

resize 事件类型不再冒泡, mousemove 事件现在是可取消 (默认行为)的,以反映(reflect)现有的实现。

12.1.3. 对 DOM Level 2 接口的更改

Event 接口
EventTarget 接口
MouseEvent 接口
EventException 异常
  • 本规范中删除了异常 EventException 。先前的 DISPATCH_REQUEST_ERR 代码被重新映射到 InvalidStateError 类型的 DOMException

12.1.4. 新接口

接口 CustomEventFocusEventKeyboardEventCompositionEventWheelEvent 已添加到事件(Events)模块中。

12.2. 用户界面事件的不同草稿(drafts)之间的更改

DOM Level3 Events 文档最初是在 2000 年到 2003 年间开发的,并作为 W3C 注释(W3C Note)发布,等待实现者的进一步反馈和参与(interest)。2006 年,它被选中在 Recommendation Track 上进行修订(revision)和推进(progress), 并取得进展,随后经过订正(revised),以反映当前实现的状态和脚本作者的需求。

尽管 DOM 3 Events 的地位仅为 W3C 注释(W3C Note),而非官方 Recommendation , 但它在一些实现上呈现,也被其他规范引用,因此在使规范适应当前环境的同时, 也将(提案的)区别(disruption)降至最低。

为了弄清原始资料(clarify the material),当前规范已从早期的 W3C 注释(W3C Note) 形式以及 DOM2 Events 的构造中进行了显著的重新排序。新的图表已经(阐述)到位, 可以更清晰地表示层次结构和事件流。以下是一些草案之间的更重要的变化:

13. 鸣谢

许多人对 DOM 规范(1级、2级或3级)做出了贡献,包括 DOM 工作组(DOM Working Group)、 DOM 兴趣组(DOM Interest Group)、 WebAPI 工作组(WebAPI Working Group)和 WebApps 工作组(WebApps Working Group)的参与者。我们特别感谢以下人员:

鸣谢人员名单的列举基本格式是"姓名(所在工作单位)",都属于专有名词, 所以不进行翻译。

Andrew Watson (Object Management Group), Andy Heninger (IBM), Angel Diaz (IBM), Anne van Kesteren (Opera Software), Arnaud Le Hors (W3C and IBM), Arun Ranganathan (AOL), Ashok Malhotra (IBM and Microsoft), Ben Chang (Oracle), Bill Shea (Merrill Lynch), Bill Smith (Sun), Björn Höhrmann, Bob Sutor (IBM), Charles McCathie-Nevile (Opera Software, Co-Chair), Chris Lovett (Microsoft), Chris Wilson (Microsoft), Christophe Jolif (ILOG), David Brownell (Sun), David Ezell (Hewlett-Packard Company), David Singer (IBM), Dean Jackson (W3C, W3C Team Contact), Dimitris Dimitriadis (Improve AB and invited expert), Don Park (invited), Doug Schepers (Vectoreal), Elena Litani (IBM), Eric Vasilik (Microsoft), Gavin Nicol (INSO), Gorm Haug Eriksen (Opera Software), Ian Davis (Talis Information Limited), Ian Hickson (Google), Ian Jacobs (W3C), James Clark (invited), James Davidson (Sun), Jared Sorensen (Novell), Jeroen van Rotterdam (X-Hive Corporation), Joe Kesselman (IBM), Joe Lapp (webMethods), Joe Marini (Macromedia), John Robinson (AOL), Johnny Stenback (Netscape/AOL), Jon Ferraiolo (Adobe), Jonas Sicking (Mozilla Foundation), Jonathan Marsh (Microsoft), Jonathan Robie (Texcel Research and Software AG), Kim Adamson-Sharpe (SoftQuad Software Inc.), Lauren Wood (SoftQuad Software Inc., former Chair), Laurence Cable (Sun), Luca Mascaro (HTML Writers Guild), Maciej Stachowiak (Apple Computer), Marc Hadley (Sun Microsystems), Mark Davis (IBM), Mark Scardina (Oracle), Martin Dürst (W3C), Mary Brady (NIST), Michael Shenfield (Research In Motion), Mick Goulish (Software AG), Mike Champion (Arbortext and Software AG), Miles Sabin (Cromwell Media), Patti Lutsky (Arbortext), Paul Grosso (Arbortext), Peter Sharpe (SoftQuad Software Inc.), Phil Karlton (Netscape), Philippe Le Hégaret (W3C, W3C Team Contact and former Chair), Ramesh Lekshmynarayanan (Merrill Lynch), Ray Whitmer (iMall, Excite@Home, and Netscape/AOL, Chair), Rezaur Rahman (Intel), Rich Rollman (Microsoft), Rick Gessner (Netscape), Rick Jelliffe (invited), Rob Relyea (Microsoft), Robin Berjon (Expway, Co-Chair), Scott Hayman (Research In Motion), Scott Isaacs (Microsoft), Sharon Adler (INSO), Stéphane Sire (IntuiLab), Steve Byrne (JavaSoft), Tim Bray (invited), Tim Yu (Oracle), Tom Pixley (Netscape/AOL), T.V. Raman (Google). Vidur Apparao (Netscape) and Vinod Anupam (Lucent).

前作者: Tom Pixley (Netscape Communications Corporation) until July 2002; Philippe Le Hégaret (W3C) until November 2003; Björn Höhrmann (Invited Expert) until January 2008; and Jacob Rossi (Microsoft) from March 2011 to October 2011.

贡献者: 在 WebApps 工作组中,以下人员在完善和修订本规范的过程中做出了大量实质性贡献: Bob Lund (Cable Laboratories), Cameron McCormack (Invited Expert / Mozilla), Daniel Danilatos (Google), Gary Kacmarcik (Google), Glenn Adams (Samsung), Hallvord R. M. Steen (Opera), Hironori Bono (Google), Mark Vickers (Comcast), Masayuki Nakano (Mozilla), Olli Pettay (Mozilla), Takayoshi Kochi (Google) and Travis Leithead (Microsoft).

术语表贡献者: Arnaud Le Hors (W3C) and Robert S. Sutor (IBM Research).

测试套件贡献者: Carmelo Montanez (NIST), Fred Drake, Mary Brady (NIST), Neil Delima (IBM), Rick Rivello (NIST), Robert Clary (Netscape), with a special mention to Curt Arnold.

感谢所有通过发送建议和更正(请继续在规范反馈上给我们的提出bug!) 或撰写信息丰富的书籍或网站来帮助改进本规范的人: Al Gilman, Alex Russell, Alexander J. Vincent, Alexey Proskuryakov, Arkadiusz Michalski, Brad Pettit, Cameron McCormack, Chris Rebert, Curt Arnold, David Flanagan, Dylan Schiemann, Erik Arvidsson, Garrett Smith, Giuseppe Pascale, James Su, Jan Goyvaerts (regular-expressions.info), Jorge Chamorro, Kazuyuki Ashimura, Ken Rehor, Magnus Kristiansen, Martijn Wargers, Martin Dürst, Michael B. Allen, Mike Taylor, Misha Wolf, Ojan Vafai, Oliver Hunt, Paul Irish, Peter-Paul Koch, Richard Ishida, Sean Hogan, Sergey Ilinsky, Sigurd Lerstad, Steven Pemberton, Tony Chang, William Edney and Øistein E. Andersen.

14. 术语表

以下一些术语定义是从其他 W3C 或标准文档中的类似定义中借用或修改而来。 请参阅定义中的链接以获取更多信息。

activation behavior

激活行为: 当一个 事件 (通常由用户通过输入设备发起) 引发元素完成指定的任务时所执行的操作。该任务为引发元素定义, 它可以 通过 宿主语言 定义,或者通过开发者自定义的变量定义,也可以同时由两者定义。 任何引发元素的默认任务 可以 是一个通用操作,或者说引发元素的任务 可以 是唯一的。 例如, HTML 或 SVG 的 <a> 元素的激活行为是使 用户代理 遍历 href 属性中指定的链接, 并使用另一个可选参数( target 属性)指定遍历后进入的浏览上下文 (如当前窗口或选项卡、一个命名窗口或新窗口)。 type 属性值为 submit 的 HTML <input> 元素的激活行为是通过开发者定义的 HTTP 方法将表单元素的值发送给开发者定义的 IRI 。参见 § 3.5 激活触发器和行为 以了解更多详细信息。

IRI 全称 Internationalized Resource Identifier ——国际化资源标识符, 它是一种互联网协议标准,它建立在统一资源标识符(URI)协议的基础上, 极大地扩展了允许的字符集。详情参考 MDN-SVG-Content_type#IRI En-Wikipedia-IRI

activation trigger

激活触发器,被定义为发起 激活行为 的事件。 参考 § 3.5 激活触发器和行为 以了解更多详细信息。

author

在本规范的上下文中, 作者内容作者脚本作者 是编写脚本或编写,使用本规范中定义的接口、 事件和事件流的可执行内容的人员。参见 一致性类别中的 § 1.2.3 内容作者和内容 了解更多细节。

可以理解成 Web 内容开发者,前端开发者

body element

在 HTML 或 XHTML 文档中,body元素表示文档的内容。在格式良好的 HTML 文档中,body元素是 根元素 的第一个子元素。

bubbling phase

冒泡阶段: 事件 在由事件目标处理 之后 , 可以被目标的祖先节点之一处理的过程。获取更多相关的详细信息, 请参阅事件流上下文中对 冒泡阶段 的描述。

capture phase

捕获阶段: 事件 在由事件目标处理 之前 , 可以被目标的祖先节点之一处理的过程。获取更多相关的详细信息, 请参阅事件流上下文中对 捕获阶段 的描述。

character value

在键值的上下文中,字符值是表示一个或多个 Unicode 字符的字符串, 例如一个字母或符号,或一组字母,每个字符都属于一组有效的 Unicode 字符类别 。在本规范中, 字符值表示为 unicode 字符串(例如,U+0020)或同一码点(code point)的字形表示 (例如," "),并且字符值会进行颜色编码以帮助区分这两种表示。

在源代码中,一些键值,例如非图形字符, 可以通过正在使用的编程语言的字符转义语法来表示。 use.

current event target

当前事件对象: 在事件流中,当前事件目标是与当前正在派发的 事件处理程序 关联的对象。此对象 可以事件目标 本身或其祖先之一。当前事件目标随着 事件 在事件流的各个 阶段 从一个对象传播到另一个对象而变化。当前事件目标是 currentTarget 属性的值。

dead key

死键是一个键或键的组合(combination),它本身不产生字符, 但与另一个键组合(击键)或按顺序(击键)产生一个修饰后的字符, 例如带有变音标记的字符(例如, "ö""é""â" )。

default action

默认行为 是一种 可选的 补充行为,它的实现 必须 与事件对象的派发合作执行。 每个事件类型定义和每个规范都定义了该事件类型的默认行为(如果有的话)。 在某些情况下,例如与 激活触发器 关联时,事件的实例 可以 具有多个 默认行为可以 通过调用 preventDefault() 方法来取消 默认行为 。更多详细信息,请参见 § 3.2 默认行为和可取消事件

delta

为响应支持 WheelEvent 接口的输入设备(如鼠标滚轮或触摸板)的物理移动, 用户代理将滚动或缩放页面,对这种滚动或缩放页面的滚动量 (以像素、行或页为单位)估计就称为 deltadelta 的值(例如, deltaXdeltaYdeltaZ 属性)将在当前 deltaMode 属性的背景中进行解释。 滚轮(或其他设备)的物理运动与 delta 是正值还是负值之间的关系取决于环境和设备。但是,如果用户代理将滚动作为 默认行为 ,则 delta 的符号由右手坐标系给出,其中正 X 、 Y 和 Z 轴分别指向 文档 的最右边、最底边和最远深度(远离用户)。

deprecated

标记为弃用的特性包含在规范中,作为对旧实现或规范的参考,但它们是 可选的 ,不鼓励使用。在本规范中, 只有已存在或正在进行替换的特性才 必须 弃用。 为了向后兼容已存在的内容(使用了弃用特性的代码),尚未支持最新特性的实现 可以 实现弃用特性,但创建内容的开发者 不应 使用弃用特性, 除非没有其他方法来解决使用场景。引用本规范的其他规范 不应 使用弃用特性,而 应当 转向弃用该特性的替代。 此规范中标记为不推荐使用的特性预计将从未来的规范中删除。

dispatch

创建一个事件,事件对象的属性和方法适宜于事件的事件类型和上下文, 并以规定的方式在 DOM 树中传播它。可与术语 fire 互换,例如, 触发一个 click 事件派发一个load事件

document

实例化 Document 接口 [DOM-Level-3-Core] 的对象,表示整个HTML或XML文本文档。 从概念上讲,它是文档树的根,并提供对文档数据的主要访问能力。

DOM application

DOM 应用程序是由开发者编写或自动生成的脚本或代码,它利用本规范中描述的接口、 方法、属性、事件和其他特性,以便在 用户代理 中向用户展现动态或交互式内容,例如 Web 应用程序。

DOM Level 0

术语 DOM Level 0 指的是 HTML 文档 功能的混合体(mix),通常没有正式指定,但传统上支持它作为事实实现的标准, 最初由 Netscape Navigator 3.0 版本或 Microsoft Internet Explorer 3.0 版本实现 。在许多情况下,属性或方法由于与 DOM Level 0 向后兼容的原因被包含 (在规范中)。

empty string

空字符串是类型为DOMString,长度为0的值,也就是说它是一个不包含任何字符的字符串 (既没有打印字符也没有控制字符)。

event

事件是某种发生的事情的表示(例如,在一个元素上呈现地的鼠标点击, 一个元素的孩子节点的移除,或其他任何的可能性),它与它的 事件目标 相关联。每个事件都是一个特定 事件类型 的实例化。

event focus

事件焦点是文档中的一个特定元素或其他 事件目标 的一种接受性(receptivity)的和聚集性(concentration)的特殊状态。 每个元素在聚焦时都有不同的行为,这取决于元素的功能,例如启动激活元素的引发效果 (见于按钮或超链接)或切换状态(见于复选框)、文本输入的接收(见于文本表单字段)、 或选定文本的复制。有关更多详细信息,请参见 § 5.2.3 文档焦点和焦点上下文

event focus ring

事件焦点环是 文档 中一组有序的 事件焦点 目标。 宿主语言 可以 定义一种或多种方法来确定(事件焦点)目标的顺序,例如文档顺序、 每个焦点目标定义的数字索引、焦点目标之间的显式指针,或以上不同模式的混合。 每个文档都 可以 包含多个焦点环或有条件焦点环。 通常,对于文档顺序或索引焦点环,焦点从最后一个焦点目标到第一个焦点目标进行 环绕

event handler
event listener

事件监听器,事件处理程序: 一个实现 EventListener 接口并提供 handleEvent() 回调方法的对象。事件处理程序是特定于语言的。 事件处理程序在特定对象 (当前事件目标) 的上下文中调用,并随事件对象本身一起提供。

在JavaScript中,用户定义的函数被认为是实现 EventListener 接口的。因此,当用户定义的函数被调用时, 事件对象将作为第一个参数提供给它。此外,JavaScript对象在定义 handleEvent() 方法时也可以实现 EventListener 接口

EventTarget 接口定义中,addEventListener() 方法的第二个参数接收一个 callback 对象。为了方便代码开发, 这个 callback 对象既可以是 EventListener 接口定义的回调函数, 也可以是一个普通的函数,所以原文档规范的注释会声称"用户定义的函数被认为是实现 EventListener 接口的"。也就是说,事件监听器,事件处理程序就是传递给 addEventListener()callback 对象。但是, 广义上来说事件监听器是一个 更广泛的概念 ,参阅 [DOM] 规范中的 事件监听器 获取更多信息。

event order

事件顺序: 使用相同或相关的事件接口,来自同一事件源或进程的事件的发生顺序。 例如,在一个有鼠标、轨迹板和键盘的环境中, 这些输入设备中的每一个都将构成一个单独的事件源,并且每个都将遵循自己的事件顺序。 紧随轨迹板上的一个 mousedown 事件触发的鼠标上的一个 mouseup 事件 不会导致 click 事件。

不同的事件顺序之间可能存在交互。例如, 一个点击事件可能会被一个并发的 keydown 事件修改 (例如,通过 Shift + click )。 然而,这些不同事件源的事件顺序是不同的。

某些接口的事件顺序与设备无关。例如,用户可以使用 Tab 键或用鼠标单击新的聚焦元素来更改焦点。在这种情况下, 事件顺序取决于进程的状态,而不是能发起状态改变的设备的状态。

event phase

参阅 阶段

event target

一个应用 § 3.1 事件派发和 DOM 事件流> 的 事件 的事件目标对象。事件目标对象是事件的 target 属性的值。

event type

事件类型是一个具有特定名称的 事件对象 ,它定义了特定的触发条件、属性和区别于其他事件类型的其它特征。例如, click 事件类型与 mouseoverload 类型具有不同的特性。 事件类型作为事件对象上的 type 属性公开。参见 § 5 事件类型 了解更多详细信息。这个术语也常常引申为具体"事件", 例如 click 事件。

fire

dispatch的同义词。

host language

宿主语言: 任何集成了另一种语言的特性或API规范的语言, 它同时规范性地引用原始规范而不是重新定义这些特性, 并且仅以原始规范定义的方式扩展这些特性。 源规范通常只打算在一种或多种宿主语言的上下文中实现, 而不是作为一种独立的语言。例如,XHTML、HTML和SVG是UI Events的宿主语言, 它们集成并扩展了本规范中定义的对象和模型。

hysteresis

滞后,人机界面设计的一种特性,在一定的位置或时间范围内接受用户输入, 以改善用户体验。例如,在用户双击鼠标按键时, 允许其花费的时间有一定小偏差是时间上的滞后作用, 如果用户操作鼠标指针从父窗口移动到子菜单, 则不立即关闭嵌套菜单是位置上的滞后作用。

IME
input method editor

输入法编辑器(IME) ,也被称为前端处理器(front end processer),是一种通过引导用户进行字典查找,在击键(key)和表意文字(ideographs or other characters,中日韩统一表意文字和其他字符)之间执行转换的输入应用程序, 这种输入应用程序常在东亚语言(如中文,日语,韩语)中使用。一个输入法编辑器( IME )也可被用于基于词语的单词补全,常用在移动设备上。 参见本规范中用于讨论IMEs的 § 6.3.3 输入法编辑器 。也可查看 文本合成系统

key mapping

键映射是将键值分配给特定键的过程,是多种因素组合的结果, 包括操作系统和键盘布局(例如, QWERTY 、德沃夏克式键映射、西班牙语、 马拉地语铭文(InScript)键盘、中文键盘等)的因素,并且还将所有 修饰按键 ( ShiftAlt 等)和 死键 的状态纳入考虑因素。

key value

键值是与处于特定状态的键相关联的 字符值 或多字符字符串(如 "Enter""Tab""MediaTrackNext" )。 无论按键是否有 字符值 ,它们各自都有一个键值。 这包括控制键、功能键、 修饰键死键 和任何其他键。 任何给定按键在任何给定时间的键值取决于 键映射

modifier key

修饰符键可更改键的正常行为,例如生成不同大小写的字符(如 Shift 键), 或更改键触发的功能(如 Fn 键或 Alt 键)。参阅 § 6.3.1 修饰符按键 获取有关修饰符键的更多信息,并参阅 [UIEvents-Key] 中的 修饰符键值表格 以获取有效的修饰符键列表。

namespace URI

命名空间 URI 是标识 XML 命名空间的URI。这在 [XML-Names11] 中被称为命名空间(namespace)名称。另请参阅 [DOM-Level-3-Core] 的第 1.3.2 节 DOM URI 和 1.3.3 节 XML 命名空间 ,它们涉及 DOM APIs 中的 URIs 和命名空间(namespace) URIs的处理和比较。

phase

事件 的上下文中, 一个阶段是沿着 DOM 树从一个节点到另一个节点的逻辑遍历集,即 从 WindowDocument 对象、 根元素 ,直到 事件目标 ( 捕获阶段 )前继续向下遍历,然后传到 事件目标 本身( 目标阶段 ),最后按照相反方向向上遍历同一个节点链 ( 冒泡阶段 )。

propagation path

传播路径: 事件 对象在往返于 事件目标 的过程中会依次通过的 当前事件目标 的有序集合。随着事件的传播, 传播路径中的每个 当前事件目标 依次设置在 currentTarget 中。传播路径最初由 事件类型 定义的一个或多个 事件阶段 组成,但 可以 被中断。传播路径也称为 事件目标链

QWERTY

QWERTY(发音为 ˈkwɜrti )是一种常见的键盘布局, 之所以如此命名,是因为字母键最上面一排的前五个字符键是Q、W、E、R、T和Y。 还有许多其他流行的键盘布局(包括德沃夏克(Dvorak)和科尔马克(Colemak)布局), 大多数是为本地化或人体工程学设计的。

除了QWERTY的键盘布局外,还有 "QWERTZ" , "AZERTY" 的键盘布局, 它们表示的是以某种字母排序方向进行排列的键盘布局。 尽管有大量的键盘布局用拉丁字母书写的语言, 但这些布局中的大多数都非常相似。根据A、M、Q、W、Y和Z键在键盘上的位置, 它们可以分为三个主要类别。这些布局通常以 D 行的前六个字母命名: AZERTY 、 QWERTY 、 QWERTZ 、 QZERTY 及其其它国家变体。 —— 维基百科 Keyboard layout
root element

根元素, 文档 的第一个元素节点, 所有其他元素都是它的子元素。文档元素(就是 <html> 元素)。

rotation

使用 WheelEvent 接口指示输入设备上的增量更改。在某些设备上, 可以 是滚轮在字面意义上的旋转,而在其他设备上, 它 可以 是沿着平面移动,或按下特定按钮。

target phase

通过这个阶段的进程(process) 事件目标 可以用来处理 事件 。获取更多有关的详细信息, 请参阅 事件流 上下文中对 目标阶段 的描述。

text composition system

一种软件组件(software component ),用于解释某种形式的替代输入(alternate input,如 输入法编辑器 、语音处理器或手写识别系统) 并将其转换为文本。

topmost event target

最顶层的事件目标 必须 是在渲染顺序中能够成为 事件目标 的最高层(highest)的元素。 在图形用户界面中,就是用户的定位设备下的元素。用户界面的 命中测试(hit testing) 装置(facility)用于确定这个目标。有关命中测试和层叠顺序(stacking order)的具体细节,请参阅 宿主语言

Unicode character categories

Unicode字符类别,为每个 Unicode 码点定义的"一般类别(General Category)" 值的子集。该子集包含所有 字母(Letter) (Ll, Lm, Lo, Lt, Lu), 数字(Number) (Nd, Nl, No), 标点(Punctuation) (Pc, Pd, Pe, Pf, Pi, Po, Ps) 符号(Symbol) (Sc, Sk, Sm, So) 的类别值。

un-initialized value

未初始化值,表示任何还没有使用initEvent()进行过初始化的事件的属性 (例如bubblescurrentTarget)的值。 一个新事件通过使用createEvent()方法创建后, 这个事件的属性会立即应用未初始化值。

user agent

用户代理,是一个程序,例如浏览器或内容创作工具,通常在客户端机器运行, 它代理用户对内容进行检索、解释、执行、呈现或创建。出于不同的目的, 用户可以在不同的时间使用不同的用户代理对内容进行操作。请参阅 § 1.2.1 Web 浏览器和其他动态或交互式的 用户代理§ 1.2.3 内容作者和内容 ,以获得 符合(conforming) 要求(规范)的用户代理的详细信息。

Window

Window引用当前文档的浏览上下文的窗口代理对象 (Window Proxy object),窗口代理对象在 HTML5 [HTML5] 中定义。

Conformance

Document conventions

Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification.

All of the text of this specification is normative except sections explicitly marked as non-normative, examples, and notes. [RFC2119]

Examples in this specification are introduced with the words “for example” or are set apart from the normative text with class="example", like this:

This is an example of an informative example.

Informative notes begin with the word “Note” and are set apart from the normative text with class="note", like this:

Note, this is an informative note.

Conformant Algorithms

Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and abort these steps") are to be interpreted with the meaning of the key word ("must", "should", "may", etc) used in introducing the algorithm.

Conformance requirements phrased as algorithms or specific steps can be implemented in any manner, so long as the end result is equivalent. In particular, the algorithms defined in this specification are intended to be easy to understand and are not intended to be performant. Implementers are encouraged to optimize.

Index

Terms defined by this specification

Terms defined by reference

References

Normative References

[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[DOM-Level-3-Core]
Arnaud Le Hors; et al. Document Object Model (DOM) Level 3 Core Specification. 28 September 2021. REC. URL: https://www.w3.org/TR/DOM-Level-3-Core/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[HTML5]
Ian Hickson; et al. HTML5. URL: https://www.w3.org/html/wg/drafts/html/master/
[POINTEREVENTS3]
Patrick Lauke; Navid Zolghadr. Pointer Events. URL: https://w3c.github.io/pointerevents/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[UIEvents-Code]
Gary Kacmarcik; Travis Leithead. UI Events KeyboardEvent code Values. URL: https://w3c.github.io/uievents-code/
[UIEvents-Key]
Gary Kacmarcik; Travis Leithead. UI Events KeyboardEvent key Values. URL: https://w3c.github.io/uievents-key/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

Informative References

[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. URL: https://drafts.csswg.org/css2/
[CSSOM-View]
Simon Pieters. CSSOM View Module. URL: https://drafts.csswg.org/cssom-view/
[DWW95]
N. Kano. Developing International Software for Windows 95 and Windows NT: A Handbook for International Software Design. 1995.
[Editing]
A. Gregor. HTML Editing APIs. URL: https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs. HTML 4.01 Specification. 27 March 2018. REC. URL: https://www.w3.org/TR/html401/
[Input-Events]
Johannes Wilm; Ben Peters. Input Events Level 1. URL: https://cdn.staticaly.com/gh/w3c/input-events/v1/index.html
[RFC20]
V.G. Cerf. ASCII format for network interchange. October 1969. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc20
[UAAG20]
James Allan; et al. User Agent Accessibility Guidelines (UAAG) 2.0. URL: https://www.w3.org/TR/2015/NOTE-UAAG20-20151215/
[UAX15]
Ken Whistler. Unicode Normalization Forms. 17 August 2022. Unicode Standard Annex #15. URL: https://www.unicode.org/reports/tr15/tr15-53.html
[Unicode]
The Unicode Standard. URL: https://www.unicode.org/versions/latest/
[US-ASCII]
Coded Character Set - 7-Bit American Standard Code for Information Interchange. 1986.
[WIN1252]
Windows 1252 a Coded Character Set - 8-Bit. URL: http://www.microsoft.com/globaldev/reference/sbcs/1252.htm
[XFORMS11]
John Boyer. XForms 1.1. 20 October 2009. REC. URL: https://www.w3.org/TR/xforms11/
[XML]
Tim Bray; et al. Extensible Markup Language (XML) 1.0 (Fifth Edition). 26 November 2008. REC. URL: https://www.w3.org/TR/xml/
[XML-Names11]
Tim Bray; et al. Namespaces in XML 1.1 (Second Edition). 16 August 2006. REC. URL: https://www.w3.org/TR/xml-names11/

IDL Index

[Exposed=Window]
interface UIEvent : Event {
  constructor(DOMString type, optional UIEventInit eventInitDict = {});
  readonly attribute Window? view;
  readonly attribute long detail;
};

dictionary UIEventInit : EventInit {
  Window? view = null;
  long detail = 0;
};

[Exposed=Window]
interface FocusEvent : UIEvent {
  constructor(DOMString type, optional FocusEventInit eventInitDict = {});
  readonly attribute EventTarget? relatedTarget;
};

dictionary FocusEventInit : UIEventInit {
  EventTarget? relatedTarget = null;
};

[Exposed=Window]
interface MouseEvent : UIEvent {
  constructor(DOMString type, optional MouseEventInit eventInitDict = {});
  readonly attribute long screenX;
  readonly attribute long screenY;
  readonly attribute long clientX;
  readonly attribute long clientY;
  readonly attribute long layerX;
  readonly attribute long layerY;

  readonly attribute boolean ctrlKey;
  readonly attribute boolean shiftKey;
  readonly attribute boolean altKey;
  readonly attribute boolean metaKey;

  readonly attribute short button;
  readonly attribute unsigned short buttons;

  readonly attribute EventTarget? relatedTarget;

  boolean getModifierState(DOMString keyArg);
};

dictionary MouseEventInit : EventModifierInit {
  long screenX = 0;
  long screenY = 0;
  long clientX = 0;
  long clientY = 0;

  short button = 0;
  unsigned short buttons = 0;
  EventTarget? relatedTarget = null;
};

dictionary EventModifierInit : UIEventInit {
  boolean ctrlKey = false;
  boolean shiftKey = false;
  boolean altKey = false;
  boolean metaKey = false;

  boolean modifierAltGraph = false;
  boolean modifierCapsLock = false;
  boolean modifierFn = false;
  boolean modifierFnLock = false;
  boolean modifierHyper = false;
  boolean modifierNumLock = false;
  boolean modifierScrollLock = false;
  boolean modifierSuper = false;
  boolean modifierSymbol = false;
  boolean modifierSymbolLock = false;
};

[Exposed=Window]
interface WheelEvent : MouseEvent {
  constructor(DOMString type, optional WheelEventInit eventInitDict = {});
  // DeltaModeCode
  const unsigned long DOM_DELTA_PIXEL = 0x00;
  const unsigned long DOM_DELTA_LINE  = 0x01;
  const unsigned long DOM_DELTA_PAGE  = 0x02;

  readonly attribute double deltaX;
  readonly attribute double deltaY;
  readonly attribute double deltaZ;
  readonly attribute unsigned long deltaMode;
};

dictionary WheelEventInit : MouseEventInit {
  double deltaX = 0.0;
  double deltaY = 0.0;
  double deltaZ = 0.0;
  unsigned long deltaMode = 0;
};

[Exposed=Window]
interface InputEvent : UIEvent {
  constructor(DOMString type, optional InputEventInit eventInitDict = {});
  readonly attribute DOMString? data;
  readonly attribute boolean isComposing;
  readonly attribute DOMString inputType;
};

dictionary InputEventInit : UIEventInit {
  DOMString? data = null;
  boolean isComposing = false;
  DOMString inputType = "";
};

[Exposed=Window]
interface KeyboardEvent : UIEvent {
  constructor(DOMString type, optional KeyboardEventInit eventInitDict = {});
  // KeyLocationCode(按键位置码)
  const unsigned long DOM_KEY_LOCATION_STANDARD = 0x00;
  const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;
  const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;
  const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;

  readonly attribute DOMString key;
  readonly attribute DOMString code;
  readonly attribute unsigned long location;

  readonly attribute boolean ctrlKey;
  readonly attribute boolean shiftKey;
  readonly attribute boolean altKey;
  readonly attribute boolean metaKey;

  readonly attribute boolean repeat;
  readonly attribute boolean isComposing;

  boolean getModifierState(DOMString keyArg);
};

dictionary KeyboardEventInit : EventModifierInit {
  DOMString key = "";
  DOMString code = "";
  unsigned long location = 0;
  boolean repeat = false;
  boolean isComposing = false;
};

[Exposed=Window]
interface CompositionEvent : UIEvent {
  constructor(DOMString type, optional CompositionEventInit eventInitDict = {});
  readonly attribute DOMString data;
};

dictionary CompositionEventInit : UIEventInit {
  DOMString data = "";
};

partial interface UIEvent {
  // Deprecated in this specification
  undefined initUIEvent();
};

partial interface MouseEvent {
  // Deprecated in this specification
  undefined initMouseEvent();
};

partial interface WheelEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initWheelEvent();
};

partial interface KeyboardEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initKeyboardEvent(DOMString typeArg,
                              optional boolean bubblesArg = false,
                              optional boolean cancelableArg = false,
                              optional Window? viewArg = null,
                              optional DOMString keyArg = "",
                              optional unsigned long locationArg = 0,
                              optional boolean ctrlKey = false,
                              optional boolean altKey = false,
                              optional boolean shiftKey = false,
                              optional boolean metaKey = false);
};

partial interface CompositionEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initCompositionEvent();
};

partial interface UIEvent {
  // The following support legacy user agents
  readonly attribute unsigned long which;
};

partial dictionary UIEventInit {
  unsigned long which = 0;
};

partial interface KeyboardEvent {
  // The following support legacy user agents
  readonly attribute unsigned long charCode;
  readonly attribute unsigned long keyCode;
};

partial dictionary KeyboardEventInit {
  // The following support legacy user agents
  unsigned long charCode = 0;
  unsigned long keyCode = 0;
};

interface MutationEvent : Event {
  // 属性更改类型(attrChangeType)
  const unsigned short MODIFICATION = 1;
  const unsigned short ADDITION = 2;
  const unsigned short REMOVAL = 3;

  readonly attribute Node? relatedNode;
  readonly attribute DOMString prevValue;
  readonly attribute DOMString newValue;
  readonly attribute DOMString attrName;
  readonly attribute unsigned short attrChange;

  undefined initMutationEvent();
};

MDN

CompositionEvent/CompositionEvent

In all current engines.

Firefox53+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CompositionEvent/data

In all current engines.

Firefox9+Safari5+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

CompositionEvent

In all current engines.

Firefox9+Safari5+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/auxclick_event

Firefox53+SafariNoneChrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android53+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/blur_event

In all current engines.

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Window/blur_event

In all current engines.

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/click_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android6+iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/compositionend_event

In all current engines.

Firefox9+Safari5+Chrome15+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Element/compositionstart_event

In all current engines.

Firefox9+Safari5+Chrome15+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Element/compositionupdate_event

In all current engines.

Firefox9+Safari5+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/contextmenu_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera10.5+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile11.1+
MDN

Element/dblclick_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android6+iOS Safari1+Chrome for AndroidNoneAndroid WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/error_event

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/focus_event

In all current engines.

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Window/focus_event

In all current engines.

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/focusin_event

In all current engines.

Firefox52+Safari5+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/focusout_event

In all current engines.

Firefox52+Safari5+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/keydown_event

In all current engines.

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/keyup_event

In all current engines.

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/mousedown_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseenter_event

In all current engines.

Firefox10+Safari7+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/mouseleave_event

In all current engines.

Firefox10+Safari7+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/mousemove_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseout_event

In all current engines.

Firefox6+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseover_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera9.5+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Element/mouseup_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/wheel_event

In all current engines.

Firefox17+Safari7+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent/FocusEvent

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent/relatedTarget

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

HTMLElement/beforeinput_event

In all current engines.

Firefox87+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

HTMLElement/input_event

In all current engines.

Firefox6+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
MDN

InputEvent/InputEvent

Firefox31+SafariNoneChrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent/inputType

In all current engines.

Firefox66+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent/isComposing

Firefox31+SafariNoneChrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent

In all current engines.

Firefox31+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/KeyboardEvent

In all current engines.

Firefox31+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/altKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/code

In all current engines.

Firefox38+Safari10.1+Chrome48+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/ctrlKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/getModifierState

In all current engines.

Firefox15+Safari10.1+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/isComposing

In all current engines.

Firefox31+Safari10.1+Chrome56+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/key

In all current engines.

Firefox23+Safari10.1+Chrome51+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/location

In all current engines.

Firefox15+Safari8+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/metaKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/repeat

In all current engines.

Firefox28+Safari10.1+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/shiftKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/MouseEvent

In all current engines.

Firefox11+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/altKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/button

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11+
MDN

MouseEvent/buttons

In all current engines.

Firefox15+Safari11.1+Chrome43+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android15+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/clientX

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11+
MDN

MouseEvent/clientY

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/ctrlKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/getModifierState

In all current engines.

Firefox15+Safari12.1+Chrome47+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/metaKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/relatedTarget

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/screenX

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/screenY

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/shiftKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile11+
MDN

UIEvent/UIEvent

In all current engines.

Firefox11+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView1+Samsung Internet1.0+Opera Mobile?
MDN

UIEvent/detail

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent/view

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

WheelEvent/WheelEvent

In all current engines.

Firefox17+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?
MDN

WheelEvent/deltaMode

In all current engines.

Firefox17+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?
MDN

WheelEvent/deltaX

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent/deltaY

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent/deltaZ

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent

In all current engines.

Firefox17+Safari3+Chrome1+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Window/load_event

In all current engines.

Firefox1+Safari1.3+Chrome1+
Opera4+Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+