1. 简介
1.1. 概述
UI Events的设计有两个主要目标。第一个目标是设计一个 事件 系统,该系统允许注册 事件侦听器 ,并通过树形结构描述事件流。此外, 该规范将为用户界面控制和文档变更通知提供标准的事件模块, 包括为每个事件模块定义的上下文信息。
UI Events的第二个目标是提供现有浏览器中使用的所有当前事件系统的公共子集。 这是为了促进现有脚本和内容的互操作性。我们并不期望这个目标能够完全向后兼容。 但是,该规范力图在可能的情况下实现这一点。
1.2. 一致性
本节是规范的。
在本规范中,关键字 MUST
, MUST NOT
, REQUIRED
, SHALL
, SHALL NOT
, SHOULD
, SHOULD NOT
, RECOMMENDED
, MAY
和 OPTIONAL
的解释如 [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 ,无障碍技术)应用程序,
或其他类似的程序),要符合用户界面事件规范, 用户代理需要支持:
-
[DOM-Level-3-Core] 中定义的核心模块
-
本规范中定义的所有接口和事件及其相关方法、属性和语义, 除了标记为 弃用 的接口和事件 (符合要求的用户代理 可以 实现弃用的接口、事件或API以保证向后兼容性, 但这并非符合一致性的必要条件)
-
在 [UIEvents-Key] 和 [UIEvents-Code] 中定义的
key
和code
值的完整集合(取决于平台可用性),以及 -
本规范中定义的所有其他规范要求。
当为 事件类型 定义的(触发事件的)条件得到满足时,符合规范的浏览器 必须 恰当地在给定 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规范惯例 ,并添加了以下补充内容:
-
打印在 键帽 上的键显示为
↓
,=
或Q
。这用于从用户的角度引用键, 而不考虑生成的KeyboardEvent
事件中的key
(键) 和code
(键码)。键帽是放置在计算机键盘的键开关上的塑料、金属或其他材料的小盖子。 键帽通常用于指示它们所对应的键功能或字母数字字符。
——英文维基。 这里使用特定格式来表示键冒上的键是为了避免与 KeyboardEvent
接口上定义的key
属性的值和code
属性值区分, 除此之外也应该与KeyboardEvent
和MouseEvent
接口上定义的ctrlKey
,shiftKey
,altKey
,metaKey
属性区分。举一个例子,如果键帽为Ctrl
的左控制键被按下,触发一个keydown
事件, 那么事件对象的key
属性值就是 "Control"("Control"
),code
属性值就是 "ControlLeft"("ControlLeft"
), 而ctrlKey
的属性值是true
,但通过getModifierState()
方法检查按键按下状态时, 需要传递的修饰符键值应该是 "Control"("Control"
) 而非ctrlKey
。 -
代表字符的字形(Glyphs)显示为:
"𣧂"
。除了汉字以外,还有很多字形需要使用这种方式表示, 例如在苹果电脑键盘上的
"Command"
("⌘"
) 键修饰符。 -
Unicode字符编码显示为:
U+003d
。 -
按键按下生成的键值名称(即
KeyboardEvent
.key
的值) 显示为:"ArrowDown"
、"="
、"q"
或"Q"
。 -
与物理键相关的键代码的名称(即
KeyboardEvent
.code
的值)显示为:"ArrowDown"
,"Equal"
或"KeyQ"
。
此外,本规范中会使用具有特定含义的一些术语。术语 实现(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.1 中文翻译 中描述的关键字等所有特殊样式时, 需要使用空格将这些词语与文本分隔,一个例子如下
我 必须 这样 排列 才符合 § 2.1.2 文本样式 规定的 中文格式 。
-
有些英文内容没必要翻译,这个时候使用原本的英文源码内容, 会出现使用英文逗号,英文单词链接左右没有出现空格的情况, 请确认这并非错误,例如接口定义时的 IDL 伪代码, 事件类型中的可信目标对象等。总之,一切规则是为了阅读时更顺畅, 不影响文档文本的阅读观感。
2.1.3. 内容补充
为了辅助理解,有些地方会使用注释,例子,或者图像进行解释说明。 这其中包括英文原档的注释,例子,和图像。有些地方为了解释的更清楚, 或者翻译上有一些问题,会添加自定义的注释,例子或图像。 为了与原本区分开来,它们不会占用例子和图像的数量, 并且能自定义标题以突出区分,如下
这是一条非规范默认注释。
这是一条非规范自定义标题注释。
这是一个默认标题的非规范例子。
这是一个自定义标题的非规范例子。
3. DOM 事件结构
本节内容并不是规范的。有关 DOM 事件结构的规范性描述,请参阅 [DOM] 。
3.1. 事件派发和 DOM 事件流
本节简要概述了事件 派发 机制,
并描述了事件如何通过 DOM 树传播。应用程序可以使用 dispatchEvent()
方法派发事件对象,事件对象将根据 DOM
事件流在 DOM 树上传播。
事件对象被分派到 事件目标 。 但在开始派发之前,事件对象的 传播路径 必须被首先确定。
传播路径 是事件经过的 当前事件目标 的有序列表。 此传播路径反映了文档树的层次结构。这个有序列表的最后一项是 事件目标 ,紧挨着事件目标的前面的一项是 目标的父亲节点(target’s parent) ,而(不包括事件目标的) 前面的所有项被称为 目标的祖先节点(target’s ancestors) 。
一旦确定了 传播路径 ,
事件对象就会经过一个或多个 事件阶段 。
一般会包含三个事件阶段:捕获阶段 、目标阶段 和 冒泡阶段。
每个事件对象都会像下面描述地那样经历完这些阶段,如果不支持某个阶段,
或者事件对象的传播被停止,则该阶段将被跳过。例如,如果 bubbles
属性被设置为 false
,
事件对象就将跳过冒泡阶段,如果在派发之前调用了 stopPropagation()
,则将跳过所有阶段。
-
捕获阶段(capture phase) : 事件对象通过目标的祖先节点从 Window 传播到目标的父节点。这个阶段也被称为 捕获阶段(capturing phase) 。
-
目标阶段(target phase) : 事件对象到达事件对象的 事件目标 。这个阶段也被称为 目标阶段(at-target phase) 。如果 事件类型 指示事件不会冒泡, 那么事件对象将在该阶段完成后停止(传播)。
所谓"到达事件对象的事件目标"指的就是事件传播到触发事件的元素节点; 事件类型决定了事件本身(在传播时)会不会冒泡, 除了可以通过查看有关事件的规范定义的事件类型表, 以确定一种事件类型能否冒泡外,实践中最直接的方法是检查事件对象的
bubbles
属性的真假值。 -
冒泡阶段(bubble phase) : 事件对象以(和捕获阶段) 相反的顺序在目标的祖先节点中传播,从目标的父节点开始,传播到 Window 结束。这个阶段也被称为 冒泡阶段(bubbling phase) 。
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] 中描述的步骤。然而, KeyboardEvent
和 MouseEvent
接口提供了额外的字典成员,用于初始化 Event
对象的键修饰符的内部状态:
特别地,这些键修饰符可以使用 getModifierState()
和 getModifierState()
方法查询内部状态。
本节补充了使用这些可选的修饰符状态初始化一个新的 Event
对象的
DOM4 步骤。
KeyboardEvent
和 MouseEvent
都继承于 UIEvent
接口,
但是它们的构造函数的可选的,用于初始化事件对象的字典并非直接继承于 UIEventInit
。KeyboardEventInit
和 MouseEventInit
字典都继承于 EventModifierInit
,这个字典定义了很多键盘修饰符属性,
用于表示键盘按键的状态。同时 EventModifierInit
是继承于 UIEventInit
的。
为了使用下面的算法构建 KeyboardEvent
、 MouseEvent
或从这些对象派生的对象,所有 KeyboardEvent
、 MouseEvent
和派生对象都具有 内部键修饰符状态 ,
可以使用 [UIEvents-Key] 规范中, 修饰符键表 中描述的键修饰符名称 来设置和检索该状态。
以下步骤补充了定义在 DOM4 中构建事件时的算法:
-
如果正在构造的
Event
是KeyboardEvent
或MouseEvent
对象, 或者是从其中任何一个派生的对象,并且向构造函数提供了EventModifierInit
参数,则运行以下子步骤:-
对于每个
EventModifierInit
参数,如果字典成员以字符串"modifier"
开头,那么将不包括前缀"modifier"
的 键修饰符名称 视为字典成员的名称, 并将Event
对象的 内部键修饰符状态 设置为与 键修饰符名称 相匹配的相应成员属性值。
-
4. 基本事件接口
[DOM] 中定义的基本事件接口是用户界面事件的基础。 这些基本事件接口 必须 始终在实现中的得到支持:
-
Event
接口及其定义在Event
接口内的常量(constant)、方法(method)和属性(attribute):-
NONE
常量 -
AT_TARGET
常量 -
type
属性 -
target
属性 -
eventPhase
属性 -
bubbles
属性 -
cancelable
属性 -
composed
属性 -
timeStamp
属性 -
isTrusted
属性 -
initEvent()
方法
-
-
CustomEvent
接口及其定义在CustomEvent
接口内的方法(method)和属性(attribute):-
detail
属性
-
EventTarget
接口及其定义在EventTarget
接口内的方法(method): -
EventListener
接口和它的handleEvent()
方法 -
Document
接口的createEvent()
方法
本规范中定义的事件类型派生自这些基本接口,并且派生自的这些接口的用户事件接口 必须 继承它们的所有属性、方法和常量。
下图描述了本规范中描述的接口的继承结构。
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) beforeinput 和 input 事件; 启动 文本合成系统 ; 可能触发 blur 和 focus 事件; 触发 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
事件的 事件监听器 附加到除了 Window , Document
, 或 Element
以外的节点,或者仅附加到冒泡阶段,则不会(在被监听事件目标上)触发此 事件监听器 。
不要将上表解释为最权威的(definitive)事件类型列表。
例如, load
事件也用于其他规范中,例如 XMLHttpRequest 中。类似地,
对于 任何 实现了 EventTarget
接口的对象,
可以调用对象的 dispatchEvent()
方法将不受信任的事件派发给它的侦听器。
与上述事件类型相关联的事件对象包含额外的上下文信息——
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
,只读属性,返回一个数字,当值为非零时, 根据具体的事件类型返回点击次数:
① 对于click
和dblclick
事件 ,UIEvent.detail
返回当前点击数;
② 对于mousedown
和mouseup
事件 ,UIEvent.detail
是1
加上当前点击数;
③ 对于其它UIEvent
事件,UIEvent.detail
一直是0
。
5.1.1.2. UIEventInit
dictionary :
UIEventInit EventInit {Window ?=
view null ;long = 0; };
detail
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
事件只能在表单 input
和 textarea
元素上派发。
实现可以在任何被认为合适的上下文中派发 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
初始化为失去焦点的元素 (在focus
或focusin
事件的情况下)或获得焦点的元素 (在blur
或focusout
事件的情况下)。
5.2.2. 焦点事件顺序
本规范中定义的焦点事件以相对于另一个焦点事件的固定顺序发生。 以下是焦点在元素之间转移时的典型事件序列(此顺序假设最初没有元素被聚焦):
事件类型 | 注释 | |
---|---|---|
用户转移焦点 | ||
1 | focus
| 在第一个目标元素接收焦点之后发送 |
2 | focusin
| 紧随 focus 事件发送 |
用户转移焦点 | ||
3 | blur
| 在第一个目标元素失去焦点之后发送 |
4 | focusout
| 紧随 blur 事件发送 |
5 | focus
| 在第二个目标元素接收焦点后发送 |
6 | focusin
| 紧随 focus 事件发送 |
该规范没有定义焦点事件在与 focus()
或 blur()
等方法交互时的行为。请参阅相关规范,其中为此类行为定义了这些方法。
5.2.3. 文档焦点和焦点上下文
此事件模块包括用于通知文档 焦点 发生变更的事件类型。 有三个不同的焦点上下文与这个讨论相关:
-
操作系统焦点上下文 ,可能是当前在计算机上运行的许多不同应用程序中的一个。 这些重点应用程序之一可以是浏览器。
-
当浏览器获得焦点后,用户可以在不同的浏览器用户界面字段 (例如,Web站点位置栏、搜索字段等)之间切换(例如,使用tab键) 应用程序焦点上下文 。 这些用户界面字段之一可以是在选项卡中显示的文档。
-
当文档本身具有焦点时,可以将 文档焦点上下文 设置为文档中任何可聚焦的元素。
本规范中定义的事件类型专门处理文档焦点(而不是操作系统焦点和应用程序焦点), 在事件详细信息中标识的 事件目标 必须 只能是文档或窗口中的文档的一部分, 而不能是浏览器或操作系统的一部分, 即使是从一个焦点上下文切换到另一个焦点上下文时也是如此。
通常,文档总是有一个焦点元素(即使它本身就是文档元素)和一个持久的 焦点环 。在焦点上下文之间切换时,
文档的当前焦点元素和焦点环通常保持当前状态。例如,
如果一个文档有三个可聚焦的元素,其中第二个元素是聚焦的,
当用户将操作系统焦点更改为另一个应用程序,然后再更改为浏览器时,
第二个元素仍将在文档中聚焦,而选项卡将把焦点更改为第三个元素。 宿主语言 可以 定义可以接收焦点的特定元素、元素 可以 接收焦点的条件、 可以 改变焦点的方式
以及焦点改变(发生事件)的顺序。例如,在某些情况下,
可以通过将指针移到元素上来获得焦点,而在其他情况下可能需要单击鼠标。
有些元素可能根本无法成为焦点,有些元素可能只能通过特殊方式
(单击元素) 变成可聚焦的元素,但不能通过按下 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
对象时,
(浏览器)实现可以使用客户端坐标 clientX
和 clientY
来计算其他坐标(例如 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, readonlyscreenX
,long
类型(4字节整型),只读-
事件发生时相对于屏幕坐标系原点的水平坐标。
该属性的 未初始化值 必须 为
0
。 screenY
, of type long, readonlyscreenY
,long
类型(4字节整型),只读-
事件发生时相对于屏幕坐标系原点的竖直坐标。
该属性的 未初始化值 必须 为
0
。 clientX
, of type long, readonlyclientX
,long
类型(4字节整型),只读-
提供了发生事件的位置在应用程序视口中的水平坐标(而不是可能滚动的页面的坐标)。
该属性的 未初始化值 必须 为
0
。 clientY
, of type long, readonlyclientY
,long
类型(4字节整型),只读-
提供了发生事件的位置在应用程序视口中的竖直坐标(而不是可能滚动的页面的坐标)。
该属性的 未初始化值 必须 为
0
。 layerX
, of type long, readonlylayerX
,long
类型(4字节整型),只读-
距离最近的 祖先 元素的水平偏移量,该 祖先 元素是 层叠上下文(stacking context) ,确定位置的盒(positioned box) ,
或者是 绘制层叠上下文(painting a stacking context) 时,
在定位阶段的绘制结果。
该属性的 未初始化值 必须 为
0
。 layerY
, of type long, readonlylayerY
,long
类型(4字节整型),只读-
距离最近的 祖先 元素的垂直偏移量,该 祖先 元素是 层叠上下文(stacking context) ,确定位置的盒(positioned box) ,
或者是 绘制层叠上下文(painting a stacking context) 时,
在定位阶段的绘制结果。
该属性的 未初始化值 必须 为
0
。 ctrlKey
, of type boolean, readonlyctrlKey
,boolean
类型,只读-
请参阅
KeyboardEvent
的ctrlKey
属性。ctrlKey
属性提供了当触发的鼠标事件发生时,ctrl
键修饰符是否活跃的状态false
。 shiftKey
, of type boolean, readonlyshiftKey
,boolean
类型,只读-
请参阅
KeyboardEvent
的shiftKey
属性。shiftKey
属性提供了当触发的鼠标事件发生时,ctrl
键修饰符是否活跃的状态该属性的 未初始化值 必须 为
false
。 altKey
, of type boolean, readonlyaltKey
,boolean
类型,只读-
请参阅
KeyboardEvent
的altKey
属性。altKey
属性提供了当触发的鼠标事件发生时,ctrl
键修饰符是否活跃的状态该属性的 未初始化值 必须 为
false
。 metaKey
, of type boolean, readonlymetaKey
,boolean
类型,只读-
请参阅
KeyboardEvent
的metaKey
属性。metaKey
属性提供了当触发的鼠标事件发生时,ctrl
键修饰符是否活跃的状态该属性的 未初始化值 必须 为
false
。 button
, of type short, readonlybutton
,short
类型(2字节整型),只读-
在按下或释放鼠标按钮引起的鼠标事件中, 必须 使用
button
来指示指针设备的哪个按键改变了状态。button
属性的值 必须 如下所示:-
0
必须 表示设备的主按键 (一般而言是左按键或单按键设备上的唯一按键,用于激活用户界面控件或选择文本) 或 表示未初始化的值。 -
1
必须 表示设备的辅助(auxiliary)按键 (一般而言是中间按键,并与鼠标滚轮组合)。 -
2
必须 表示设备的次(secondary)按键 (一般而言是右按键,通常用于显示一个上下文菜单)。 -
3
必须 表示设备的X1(后退)按键 (第4按键,常用于浏览器后退按键)。 -
4
必须 表示设备的X2(前进)按键 (第5按键,常用于浏览器前进按键)
一些定位设备提供或模拟更多的按键状态,并且 可以 使用高于
2
或低于0
的值来表示这样的按键状态。对于不是由按下/释放鼠标按键引起的事件,
button
的值不会更新。 在这些场景中,请注意不要将值0
解释为左按键的激活状态,而是将其解释为 未初始化值 。一些与
mousedown
和mouseup
等事件相关的 默认操作 取决于触发事件的特定鼠标按键。该属性的 未初始化值 必须 为
0
。 -
buttons
, of type unsigned short, readonlybuttons
,unsigned short
类型(无符号2字节整型),只读-
在任何鼠标事件触发期间, 必须 使用
buttons
来指示当前设备正被按下的鼠标按键组合,以位掩码表示。虽然名称相似,但
buttons
属性和button
属性的值非常不同。 在mousedown
/mouseup
事件处理程序中,button
的值被认为是有效的,而buttons
属性反映了任何可信的MouseEvent
对象(在事件被派发时)的鼠标按键的状态,因此它能表示 "当前没有活动的按键"这一状态(buttons
属性值为0
时)。buttons
属性的值 必须 是如下所示 (组成的位掩码):-
0
必须 表示当前没有按键被激活按键激活就是按键处于按下状态,下同理
-
1
必须 表示设备的主按键处于激活状态 (一般而言,设备的主按键是左按键或单按键设备上的唯一按键,用于激活用户界面控件或选择文本)。 -
2
必须 表示次按键(如果存在)处于激活状态 (一般而言,设备的次按键是右按键,通常用于显示一个上下文菜单)。 -
4
必须 表示辅助按键处于激活状态 (一般而言是中间按键,并与鼠标滚轮组合)。
一些定位设备能提供或模拟更多按键。为了表示这些按键,每个连续按钮的值 必须 增长一倍(也就是在二进制序列
8
,16
,32
,...)。因为任何一组按键值的总和(与操作)都是一个唯一的数字, 所以对于一个拥有任意数量的鼠标按键的设备而言, 开发者可以使用逐位(遍历)操作来确定当前被按下的按钮数量, 以及它们是哪些按键。例如,值
3
表示当前同时按下了左按键和右按键,而值5
表示当前同时按住了左按键和中间按键。一些与
mousedown
和mouseup
等事件相关的 默认操作 取决于使用中的特定鼠标按键。该属性的 未初始化值 必须 为
0
。 -
relatedTarget
, of type EventTarget, readonly, nullablerelatedTarget
,EventTarget
类型,只读,可空-
用于标识与 UI 事件相关的次要
EventTarget
,具体值取决于事件的类型。该属性的 未初始化值 必须 为
null
。 getModifierState(keyArg)
-
(该方法)在本规范中引入介绍
使用键值查询(键盘按键)修饰符的状态。
如果它(传入的
keyArg
)是一个 (键盘) 修饰符键并且对应的按键被激活, 则返回true
,否则返回false
。- DOMString keyArg
- 有关此参数的描述,请参阅
KeyboardEvent
的getModifierState()
方法。
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 to0
screenX
,long
类型(4字节整型), 默认值为0
-
将
MouseEvent
对象的screenX
属性初始化为鼠标指针在用户屏幕上期望的水平相对位置。将事件对象的
screenX
属性初始化为给定的鼠标位置时, 不得将用户的鼠标指针移动到初始化位置。 screenY
, of type long, defaulting to0
screenX
,long
类型(4字节整型), 默认值为0
-
将
MouseEvent
对象的screenY
属性初始化为鼠标指针在用户屏幕上期望的竖直相对位置。将事件对象的
screenY
属性初始化为给定的鼠标位置时, 不得将用户的鼠标指针移动到初始化位置。 clientX
, of type long, defaulting to0
clientX
,long
类型(4字节整型), 默认值为0
-
将
MouseEvent
对象的clientX
属性初始化为鼠标指针相对于用户浏览器的客户端窗口(视口)期望的水平位置。将事件对象的
clientX
属性初始化为给定的鼠标位置时, 不得将用户的鼠标指针移动到初始化位置。 clientY
, of type long, defaulting to0
clientY
,long
类型(4字节整型), 默认值为0
-
将
MouseEvent
对象的clientY
属性初始化为鼠标指针相对于用户浏览器的客户端窗口(视口)期望的竖直位置。将事件对象的
clientY
属性初始化为给定的鼠标位置时, 不得将用户的鼠标指针移动到初始化位置。 button
, of type short, defaulting to0
button
,short
类型(2字节整型), 默认值为0
-
将
MouseEvent
对象的button
属性初始化为一个数字,这个数字表示鼠标按键期望的状态。值 0 用于表示鼠标主按键,值 1 用于表示辅助按键/鼠标中键,值 2 用于表示鼠标右键。大于 2 的数字也是可能的,但在本文档中没有指定规范。
buttons
, of type unsigned short, defaulting to0
buttons
,unsigned 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 tonull
relatedTarget
,EventTarget
类型, 默认值为null
-
relatedTarget
应该初始化为鼠标指针刚刚离开其边界的元素 (在发生 mouseover 或 mouseenter 事件的情况下) 或鼠标指针正在进入其边界的元素(在发生 mouseout 或 mouseleave 或 focusout 事件的情况下)。对于其他事件,不需要分配此值(并设为默认值null
)。
在生成鼠标事件时,实现 必须 维护 当前的点击次数 。这 必须 是一个非负整数,表示在特定时间内连续点击定位设备按键的次数。 计数重置之后的延迟是取决于环境配置。
这个点击次数使用 UIEvent
定义的 detail
属性保存。
5.3.2. 事件修饰符初始化器
MouseEvent
和 KeyboardEvent
接口共享一组键盘修饰符属性,
并支持检索附加修饰符状态的机制。以下字典使开发者能够初始化 MouseEvent
和 KeyboardEvent
接口的键盘修饰符属性,
以及通过 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 tofalse
ctrlKey
,boolean
类型, 默认值为false
-
如果要将
Control
键修饰符视为活动状态, 则将MouseEvent
或KeyboardEvent
对象的ctrlKey
属性初始化为true
,否则为false
。当为
true
时,实现还必须初始化事件对象的键修饰符状态, 以便在提供参数Control
时,对getModifierState()
或getModifierState()
的调用必须返回true
。 shiftKey
, of type boolean, defaulting tofalse
shiftKey
,boolean
类型, 默认值为false
-
如果要将
Shift
键修饰符视为活动状态, 则将MouseEvent
或KeyboardEvent
对象的shiftKey
属性初始化为true
,否则为false
。当为
true
时,实现还必须初始化事件对象的键修饰符状态, 以便在提供参数Shift
时,对getModifierState()
或getModifierState()
的调用必须返回true
。 altKey
, of type boolean, defaulting tofalse
altKey
,boolean
类型, 默认值为false
-
如果要将
Alt
(可替代)(或Option
)键修饰符视为活动状态, 则将MouseEvent
或KeyboardEvent
对象的altKey
属性初始化为true
,否则为false
。当为
true
时,实现还必须初始化事件对象的键修饰符状态, 以便在提供参数Alt
时,对getModifierState()
或getModifierState()
的调用必须返回true
。 metaKey
, of type boolean, defaulting tofalse
metaKey
,boolean
类型, 默认值为false
-
如果要将
Meta
键修饰符视为活动状态, 则将MouseEvent
或KeyboardEvent
对象的metaKey
属性初始化为true
,否则为false
。当为
true
时,实现还必须初始化事件对象的键修饰符状态, 以便在提供参数Meta
时,对getModifierState()
或getModifierState()
的调用必须返回true
。 modifierAltGraph
, of type boolean, defaulting tofalse
modifierAltGraph
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
AltGraph
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierCapsLock
, of type boolean, defaulting tofalse
modifierCapsLock
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
CapsLock
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierFn
, of type boolean, defaulting tofalse
modifierFn
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
Fn
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierFnLock
, of type boolean, defaulting tofalse
modifierFnLock
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
FnLock
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierHyper
, of type boolean, defaulting tofalse
modifierHyper
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
Hyper
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierNumLock
, of type boolean, defaulting tofalse
modifierNumLock
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
NumLock
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierScrollLock
, of type boolean, defaulting tofalse
modifierNumLock
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
NumLock
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierSuper
, of type boolean, defaulting tofalse
modifierSuper
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
Super
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierSymbol
, of type boolean, defaulting tofalse
modifierSymbol
,boolean
类型, 默认值为false
- 初始化事件对象的键修饰符状态,以便在提供
Symbol
参数时,调用getModifierState()
或getModifierState()
必须返回 true 。 modifierSymbolLock
, of type boolean, defaulting tofalse
modifierSymbolLock
,boolean
类型, 默认值为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 的子元素:
当定位设备从元素堆叠外部移入标记为 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
|
允许在一对 mousedown
和 mouseup
事件触发后,仍然派发 click
或 dblclick
事件(在mousedown
和 mouseup
事件派发过程中)的延迟时间、程度、距离和 mousemove
事件的数量的具体限制或容忍度,将取决于实现、设备和平台。
这种容忍度有助于身体残疾的用户(浏览操作网页),比如,
有些手不稳的用户与定位设备交互时的场景。
mousedown
和 mouseup
事件的事件目标是相同的元素且没有 mouseout
或 mouseleave
事件居于中间发生时,应该触发 click
和 dblclick
事件,
当关联的 mousedown
和 mouseup
事件目标不同时,
应该在二者 (两个不同事件目标元素) 最近公共祖先上触发 click
和 dblclick
事件。
如果 mousedown
事件的事件目标是 HTML 文档的 body 元素,而相应的 mouseup
事件的事件目标是 根元素 ,那么 click
事件将在 根元素 上触发,因为它是最近的公共祖先节点。
如果在鼠标事件序列期间从 DOM 中删除了 事件目标 (例如,目标元素),则该序列中的其余事件 不得 在该元素上触发。
如果在 mousedown
事件触发的(事件处理程序中)从 DOM 中删除了目标元素,
则不会在该元素上派发 mouseup
、 click
或 dblclick
事件,也不会派发任何默认激活事件。但是,在移除初始目标元素之后, 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
事件触发之前 可以 是同一元素上触发的 mousedown
和 mouseup
事件,而不考虑其他节点类型 (例如文本节点) 之间的更改。
根据环境配置,如果在按下和释放指针设备按键之间发生一个或多个 mouseover
、 mousemove
和 mouseout
事件,
则 可以 会派发 auxclick
事件。
auxclick
事件类型的 默认行为 根据事件的 事件目标 和 button
或 buttons
属性的值而有所不同。 auxclick
事件类型的典型默认操作如下:
-
如果 事件目标 具有相关的 激活行为 ,则 默认操作 必须 是执行该激活行为 (参见 § 3.5 激活触发器和行为 ) 。
接收和处理点击中间按键触发的 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
应仅针对主要指针按键触发 (即,当 button
为 0
, buttons
为 1
时) 。
辅助按钮 (如标准鼠标上的中键或右键) 不得触发 click
事件。
请参阅 auxclick
以获取与非主要按键关联的相应事件。
click
事件触发之前 可以 是同一元素上触发的 mousedown
和 mouseup
事件,而不考虑其他节点类型 (例如文本节点) 之间的更改。
根据环境配置,如果在按下和释放指针设备按键之间发生一个或多个 mouseover
、 mousemove
和 mouseout
事件,
则 可以 会派发 click
事件。 click
事件之后 可以 还会触发 dblclick
事件。
如果用户在具有较大行高样式的 <p>
元素的子节点——文本节点上按下鼠标按键,稍微移动鼠标(不松开鼠标按键),
使其不再位于包含文本的区域的上方,但仍然位于该 <p>
元素的包含块内 (即,指针位于同一文本块的行之间,但不位于文本节点本身的上方) ,
然后松开鼠标按键,因为用户一直处于同一元素的领域内,这可能仍然会触发 click
事件 (假设鼠标按键点击和释放的时间间隔落在 click
的正常时间上的 滞后 范围内) 。
请注意,用户代理生成的鼠标事件不会在文本节点上派发。
除了与指针设备关联外, click
事件类型必须 作为元素激活的一部分进行调度,如 § 3.5 激活触发器和行为 所述。
为了最大限度地提高可访问性,鼓励开发者在定义自定义控件的激活行为时使用 click
事件类型,而不是其他更特定于设备的定位设备事件类型,如 mousedown
或 mouseup
。尽管 click
事件类型起源于指针设备(例如鼠标),但随后的实现增强将其扩展到了该关联之外,
并且可以将其视为用于元素激活的设备独立的事件类型。
click
事件类型的 默认行为 根据事件的 事件目标 和 button
或 buttons
属性的值而有所不同。 click
事件类型的典型默认操作如下:
-
如果 事件目标 具有相关的激活行为,则 默认行为 必须 是执行该激活行为 (参见 § 3.5 激活触发器和行为 ) 。
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冒泡传递 | 能 |
默认行为 | 没有 |
上下文 (可信事件) |
|
当定位设备的主要按键在一个元素上被点击两次时,用户代理 必须 派发这个事件。双击的定义取决于环境配置,
但有一点是确定的: mousedown
、 mouseup
和 dblclick
时间
的事件目标 必须 相同。如果同时触发点击和双击时间,
则此事件类型( dblclick
) 必须 在事件类型 click
之后派发,并且在事件类型 mouseup
之后分派。
与 click
事件一样, dblclick
事件应该仅针对主要指针按键触发。
次要按键 必须 触发 dblclick
事件。
取消(调用 preventDefault()
方法) click
事件不会影响触发 dblclick
事件。
与 click
事件类型一样, dblclick
事件类型的 默认行为 根据事件的 事件目标 和 button
或 buttons
属性的值而变化。通常, dblclick
事件类型的典型 默认行为 与对应的 click
事件类型的行为相匹配。
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轴的缩放滚动 。
用户的环境可能被配置为将垂直滚动与沿y轴的旋转相关联, 将水平滚动与沿x轴的旋转相关联, 并将缩放与沿z轴的旋转相关联。
WheelEvent
对象的 deltaX
、deltaY
和 deltaZ
属性表示沿其各自轴的测量值,单位为像素、行或页。
(这些属性)报告的测量值是通过特定于环境的算法将滚轮装置的实际 旋转
/ 移动 转换为适当的值和单位后提供的。
用户的环境设置可以自定义,从而以不同的方式解释滚轮设备的实际 旋转 / 移动。
普通 有齿轮的
(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 = {}); // DeltaModeCode
eventInitDict 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, readonlydeltaX
,double
类型(64位双精度浮点数),只读-
在
wheel
事件的默认行为是滚动(scroll)的用户代理中, 该值 必须 是在事件未取消的情况下, 沿 x 轴滚动的测量值(以像素、行或页面为单位)。否则(默认行为并非滚动), 这是滚轮设备围绕 x 轴的运动时,实现决定的测量值(以像素、行或页为单位)。该属性的 未初始化值 必须 是
0.0
。 deltaY
, of type double, readonlydeltaY
,double
类型(64位双精度浮点数),只读-
在
wheel
事件的默认行为是滚动(scroll)的用户代理中, 该值 必须 是在事件未取消的情况下, 沿 y 轴滚动的测量值(以像素、行或页面为单位)。否则(默认行为并非滚动), 这是滚轮设备围绕 y 轴的运动时,实现决定的测量值(以像素、行或页为单位)该属性的 未初始化值 必须 是
0.0
。 deltaZ
, of type double, readonlydeltaZ
,double
类型(64位双精度浮点数),只读-
在
wheel
事件的默认行为是滚动(scroll)的用户代理中, 该值 必须 是在事件未取消的情况下, 沿 z 轴滚动的测量值(以像素、行或页面为单位)。否则(默认行为并非滚动), 这是滚轮设备围绕 z 轴的运动时,实现决定的测量值(以像素、行或页为单位)该属性的 未初始化值 必须 是
0.0
。 deltaMode
, of type unsigned long, readonlydeltaMode
,unsigned 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 to0.0
deltaX
,double
类型(64位双精度浮点数),默认值为0.0
- 查阅下面的
deltaZ
属性。 deltaY
, of type double, defaulting to0.0
deltaY
,double
类型(64位双精度浮点数),默认值为0.0
- 查阅下么
deltaZ
属性。 deltaZ
, of type double, defaulting to0.0
deltaZ
,double
类型(64位双精度浮点数),默认值为0.0
- 初始化
WheelEvent
对象的deltaZ
属性。 该属性(以及deltaX和deltaY属性) 的相对正值由右手坐标系给出,其中 X 、 Y 和 Z 轴分别指向文档的最右边、最下边和最远深度(远离用户), 相对负值在各自相反的方向上。 deltaMode
, of type unsigned long, defaulting to0
deltaMode
,unsigned long
类型(32位无符号整型),默认值为0
- 可以将
WheelEvent
对象上的deltaMode
属性初始化为枚举值 0 、 1 或 2 ,如果滚轮 旋转 会导致滚动,这些值分别表示滚动的像素量 (DOM_DELTA_PIXEL
)、滚动的行数 (DOM_DELTA_LINE
)或滚动的页数 (DOM_DELTA_PAGE
)。
初始化
,
意思就是 daltaX/Y/Z 属性的值的正负符号确定和文档位置坐标系相同。
对于鼠标设备而言, 逆时针 滚动鼠标滚轮(向下,向右或向远离用户)时, delta 值为正, 顺时针 滚动鼠标滚轮(向上,向左或靠近用户)时, delta 值为负。 WheelEvent
对象的 deltaZ
属性。
该属性(以及deltaX和deltaY属性)的相对正值由右手坐标系给出
5.4.2. Wheel Event Types
5.4.2.1. wheel
类型 | wheel
|
---|---|
接口 | WheelEvent
|
同步 / 异步 | 异步 |
冒泡 | 能 |
可信目标对象 | Element
|
可取消默认行为 | 多种情况 |
能否从Shadow DOM冒泡传递 | 能 |
默认行为 | 滚动(或缩放)文档 |
上下文 (可信事件) |
|
当鼠标滚轮沿着任何轴旋转/滚动时,或当等效输入设备
(如鼠标球、某些平板电脑或触摸板等)模拟了此类动作时, 用户代理 必须 派发 wheel
事件。根据平台和输入设备,对于旋钮的 deltas (diagonal wheel deltas),(它的事件)交付方式 既 可以 是多个非零轴的 delta 整合入单个 wheel
,又 可以 是为每个非零轴的 delta 触发单独的 wheel
事件。
非零轴向包括 X 轴、 Y 轴和 Z 轴。在 delta 不为 0
时, delta 可以是 X , Y, Z 三个轴上的增量值,
上述介绍了两种处理旋钮操作产生多个轴方向不同的 deltas 值时的交付方式——既可以整合到一个 wheel
,
使用三个轴对应的 deltaX
, deltaY
, deltaZ
属性指示各种轴增量值;
又可以为三个轴上的增量值派发三个 wheel
事件,只使用各自的 delta 指示对应的属性值。
wheel
事件类型的典型 默认行为 是按(用户代理)指定的数量滚动(或在某些情况下缩放)文档。如果此事件被取消,
则实现 不得 滚动或缩放文档
(或执行与此事件类型相关的任何其他实现决定的的默认行为)。
在一些 用户代理 中,或者在一些输入设备中, 滚轮转动的速度会影响 delta 值,更快的速度会产生更高(/大)的 delta 值。
5.4.2.2. 滚轮事件的可取消性
在一个滚轮事件上调用 preventDefault
可以阻止或中断滚动。
为了获得最大的滚动性能,
用户代理可能不会等待每个与滚动相关联的滚轮事件被处理完毕
(检阅滚轮事件是否被取消)才派发事件。在这种情况下,用户代理应该生成 cancelable
属性为 false
的 wheel
事件,
表明 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
事件类型的事件监听器是正确的做法,可以通过这些被监听元素的 scrollLeft
和 scrollTop
属性获取垂直与水平滚动的距离。需要注意,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, nullabledata
,DOMString
类型,只读,可空-
data
保存由一种输入法生成的字符的值。 这 可以 是一个简单的 Unicode 字符或一个非空的 Unicode 字符序列 [Unicode] 。字符 应当 按照 Unicode 规范化形式 NFC 的定义进行规范化,它在 [UAX15] 中定义。 这个属性 可以 包含 空字符串 。该属性的 未初始化值 必须 为
null
。 isComposing
, of type boolean, readonlyisComposing
,boolean
类型,只读-
如果输入事件作为一个合成会话(composition session)的一部分发生,
该属性值为
true
,也就是说,在一个compositionstart
事件之后,在对应的compositionend
事件之前触发。该属性的 未初始化值 必须 是
false
。 inputType
, of type DOMString, readonlyinputType
,DOMString
类型,只读-
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 tonull
data
,DOMString
类型,可空,默认值为null
- 初始化 InputEvent 对象的
data
属性。 isComposing
, of type boolean, defaulting tofalse
isComposing
,boolean
类型,默认值为false
- 初始化 InputEvent 对象的
isComposing
属性。 inputType
, of type DOMString, defaulting to""
inputType
,DOMString
类型,默认值为""
- 初始化 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 = {}); // KeyLocationCode(按键位置码)
eventInitDict 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
键。
DOM_KEY_LOCATION_LEFT
- 激活按键源自左侧按键位置(当该按键可能有多个位置时)。
DOM_KEY_LOCATION_RIGHT
- 激活按键源自右侧按键位置(当该按键可能有多个位置时)。
DOM_KEY_LOCATION_NUMPAD
-
激活按键源于数字 小键盘 或与数字 小键盘 对应的虚拟按键
(当该按键可能有多个位置时)。请注意,
NumLock
键的location
属性应始终编码为DOM_KEY_LOCATION_STANDARD
。 key
, of type DOMString, readonlykey
,DOMString
类型,只读-
key
保存与所按下按键相对应的 键属性值 。key
属性与遗留的keyCode
属性无关, 并且没有相同的值集。该属性的 未初始化值 必须 是空字符串
""
。 code
, of type DOMString, readonlycode
,DOMString
类型,只读-
code
保存一个字符串,用于标识正在按下的物理键。 该值不受当前键盘布局或修饰键状态的影响, 因此特定物理按键将始终返回相同的值。该属性的 未初始化值 必须 是空字符串
""
。 location
, of type unsigned long, readonlylocation
,unsigned long
类型(32位无符号整型),只读-
location
属性保存上述四个按键位置码(KeyLocationCode) 之一,它指示按键在设备上的逻辑位置。此属性 必须 设置为 DOM_KEY_LOCATION 常量之一,以指示按键在设备上的位置。
如果 用户代理 允许重新映射按键, 则 必须 将重新映射的按键的
location
值设置为适合新按键的值。 例如,如果"ControlLeft"
键映射到"KeyQ"
键,则location
属性 必须 设置为DOM_KEY_LOCATION_STANDARD
。相反,如果"KeyQ"
键被重新映射到 其中一个Control
键,则location
属性 必须 设置为DOM_KEY_LOCATION_LEFT
或DOM_KEY_LOCATION_RIGHT
。该属性的 未初始化值 必须 是
0
. ctrlKey
, of type boolean, readonlyctrlKey
,boolean
类型,只读-
如果
Control
(control)键修饰符处于活动状态,则为true
。该属性的 未初始化值 必须 是
false
。 shiftKey
, of type boolean, readonlyshiftKey
,boolean
类型,只读-
如果shift(
Shift
)键修饰符处于活动状态,则为true
。该属性的 未初始化值 必须 是
false
. altKey
, of type boolean, readonlyaltKey
,boolean
类型,只读-
如果
Alt
(alternative)(或"Option"
)键修饰符处于活动状态, 则为true
。该属性的 未初始化值 必须 是
false
. metaKey
, of type boolean, readonlymetaKey
,boolean
类型,只读-
如果meta(
Meta
)键修饰符处于活动状态,则为true
。在Macintosh系统(苹果电脑)上的
"Command"
("⌘"
) 键修饰符使用此键修饰符表示。该属性的 未初始化值 必须 是
false
. repeat
, of type boolean, readonly-
如果按键被持续按下,则为
true
。持续按下一个键 必须 导致事件keydown
,beforeinput
,input
,按此触发顺序重复(派发), 重复的速率由系统配置决定。对于具有 长按按键(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, readonlyisComposing
,boolean
类型,只读-
如果按键事件作为合成会话(composition session)的一部分发生,即在
compositionstart
事件之后和相应的compositionend
事件之前,则为true
,否则为false
。该属性的 未初始化值 必须 是
false
. getModifierState(keyArg)
-
使用键值查询修饰键的状态。
如果它(传入的键值)是修饰键并且修饰键处于激活状态,则返回
true
,否则返回false
。- DOMString keyArg
-
修饰符键值。有效的 修饰键 在
[[UIEvents Key]] 中的 修饰符键值表格 中定义。
如果应用程序希望区分左右修饰键,则可以使用键盘事件和
location
来推断此信息。"修饰按键","修饰符按键","修饰键","修饰符",这几种不同的说法, 在本规范的翻译中都表示"修饰符按键",即"Modifier Keys", 有时候也会使用"modifiers"简化表示。它是计算机键盘上的一种特殊键 (或组合键),当按下时, 它会临时修改另一个键的正常功能。
常见的修饰键有Shift
,Alt
,Ctrl
等, 想要了解修饰符按键的功能定义,可以查阅 修饰符按键 , 想要知晓本方法检查修饰键的状态传入的所有参数,如上述,查阅 修饰符键值表格 。
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""
key
,DOMString
类型,默认值为""- 将所有键盘修饰符(如shift-state)纳入考虑范围在考虑后,将键盘事件
(KeyboardEvent)对象的
key
属性初始化为表示该键含义的 unicode 字符串。该值是按键的最终有效值。如果键不是可打印字符, 则它应该是 [UIEvents-Key] 中定义的键值之一。 code
, of type DOMString, defaulting to""
code
,DOMString
类型,默认值为""- 忽略键盘布局等任何键盘配置变动,将键盘事件(KeyboardEvent)
对象的
code
属性初始化为表示为按下的物理键的 unicode 字符串。此值应该是[UIEvents-Code] 中定义的键码值之一。 location
, of type unsigned long, defaulting to0
location
,unsigned long
类型(无符号2字节整型),默认为0
-
将键盘事件(KeyboardEvent)对象的
location
属性初始化为以下表示位置的数值常量之一:-
DOM_KEY_LOCATION_STANDARD
(数值 0) -
DOM_KEY_LOCATION_LEFT
(数值 1) -
DOM_KEY_LOCATION_RIGHT
(数值 2) -
DOM_KEY_LOCATION_NUMPAD
(数值 3)
-
repeat
, of type boolean, defaulting tofalse
repeat
,boolean
类型,默认值为false
- 初始化键盘事件(KeyboardEvent)对象的
repeat
属性。 如果当前键盘事件(KeyboardEvent)被认为是由长时间按下(非规范补充: 见于 reapeat属性自定义注释 ) 任何单个键引起的类似事件的重复序列的一部分,则该属性应设置为true
,否则为false
。 isComposing
, of type boolean, defaulting tofalse
isComposing
,boolean
类型,默认值为false
- 初始化键盘事件(KeyboardEvent)对象的
isComposing
属性。 如果正在构建的事件是作为合成序列的一部分发生的,则该属性应设置为true
,否则为false
。
key
属性值,
键盘事件的码值就是接口中定义的 code
属性值,
前者表示按键的含义通常与键入值有关,会因为区域设置有所不同,
后者表示物理按键的编码,用于标识每个独立的物理按键。在翻译过程中,
"键值","键属性值","按键值"都是 key
属性值,即 "key value"
; "码值","键码值","码属性值","键码属性值"都是 code
属性值,即 "code value" 。关于二者的含义以及所表示的值集合,可以参阅 用户界面事件键盘事件
key 属性值 和 用户界面事件键盘事件 code 属性值 。 keyCode
、 charCode
和 which
。 keyCode
属性表示与计算机键盘上某个特定键关联的数值,而 charCode
属性则表示与该键关联的字符的 ASCII 值(可能与keyCode
值相同),
并且仅适用于生成 字符值 的键。
在实践中, keyCode
和 charCode
在不同的平台上不一致,
甚至相同的实现在不同的操作系统上或使用不同的本地化都会有区别。
此规范既没有定义 keyCode
或 charCode
的值,
也没有定义这两个遗留属性的行为。在符合规范的用户界面事件实现中,
内容作者可以使用 key
和 code
作为替代。
获取更多相关信息,请参阅有关 遗留键属性 的资料性性附录。
为了与现有内容兼容,虚拟键盘,如基于屏幕的输入设备上的软件键盘, 预计会产生正常范围的键盘事件,即使它们不具有物理键。
在某些实现或系统配置中,某些按键事件或其按键值可能会被使用中的 输入法编辑器(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冒泡传递 | 能 |
默认行为 | 多种: (触发) beforeinput 和 input 事件; 启动 文本合成系统 ; (触发) blur 和 focus 事件; (触发) keypress 事件 (如果支持); (执行) 激活行为 ; (触发)其它事件
|
上下文 (可信事件) |
|
当按下某个键盘按键时, 用户代理 必须 派发此事件。 keydown
事件类型是依赖设备的,它依赖输入设备的功能以及它们在操作系统中的映射方式。
此事件类型 必须 在 键映射 之后生成。此事件类型 必须 在与同一个键关联的 beforeinput
、 input
和 keyup
事件之前被派发。
keydown
事件的默认行为取决于按键:
-
如果键与一个字符相关联(也就是键值),则默认行为 必须 是先派发
beforeinput
事件, 然后再派发input
事件。如果键与多个字符相关(例如与宏(macro) 或某些 死键 序列相关),则默认行为 必须 是为每个字符分配一组beforeinput
/input
事件 -
如果按键与 文本合成系统 相关联,则默认行为 必须 是启动该系统
-
如果键是
Tab
键,则默认行为 必须 是将文档焦点从当前焦点元素(如果有)转移到新的焦点元素,如 焦点事件类型 中描述的那样 -
如果键是
Enter
或click
事件, 如果用户代理支持DOMActivate
事件类型也会派发一个DOMActivate
事件(请参阅 § 3.5 激活触发器和行为 了解更多详细信息)
如果此事件被取消,则 不得 派发关联的事件类型,并且 不得 执行关联的行为。
keydown
和 keyup
事件传统上与能检测到的任何按键相关联,
而不仅仅是那些产生 字符值 的键。
5.6.4.2. keyup
类型 | keyup
|
---|---|
接口 | KeyboardEvent
|
同步 / 异步 | 同步 |
冒泡 | 能 |
可信目标对象 | Element
|
可取消默认行为 | 能 |
能否从Shadow DOM冒泡传递 | 能 |
默认行为 | 没有 |
上下文 (可信事件) |
|
当按键被释放时,用户代理 必须 派发此事件。 keyup
事件类型是依赖设备的,它依赖输入设备的功能以及它们在操作系统中的映射方式。
此事件类型 必须 在 键映射 之后生成。此事件类型 必须 在 keydown
、 beforeinput
和与同一个键关联的 input
事件之后被派发。
keydown
和 keyup
事件传统上与能检测到的任何按键相关联,
而不仅仅是那些产生 字符值 的键。
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, readonlydata
,DOMString
类型,只读-
data
保存由输入法生成的字符值。这 可以 是单个 Unicode 字符,也可能是非空的 Unicode 字符序列 [Unicode] 。字符 应当 按照 [UAX15] 中定义的 Unicode 规范化形式 NFC 进行标准化。 此属性 可以 是 空字符串 。该属性的 未初始化值 必须 是
""
(空字符串)。
5.7.1.2. CompositionEventInit
dictionary :
CompositionEventInit UIEventInit {DOMString data = ""; };
data
, of type DOMString, defaulting to""
data
,data
类型,默认值为""
- 将 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. 合成过程中的按键事件
在合成会话期间, keydown
和 keyup
事件仍 必须 发送,并且这些事件 必须 将 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 作为合成的一部分更新时, beforeinput
和 input
事件都会与 compositionupdate
事件一起被派发。由于没有与 compositionend
事件相关联的DOM更新,因此此时(合成结束时)不应发送 beforeinput
和 input
事件。
事件类型 | 注释 | |
---|---|---|
1 | beforeinput
| 取消此操作将阻止 DOM 更新和 input 事件(的派发)。
|
2 | compositionupdate
| |
此时会发生任何可能的 DOM 更新。 | ||
3 | input
| 仅当 DOM 已更新时才发送。 |
4 | compositionend
|
事件类型 | 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 |
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. 键盘输入
本节内容不是规范的
每个键与整个键盘的关系有三个独立的方面, 每个方面在不同型号和配置的键盘中都有所不同,尤其是地区不同时,键盘差异更大:
-
机械布局(Mechanical layout): 键盘上物理按键的尺寸、 大小和位置
-
视觉标记(Visual markings): 标记每个按键的标签(或 图例(legends) )
-
功能映射: 每个键的抽象键值关联。
本规范仅根据 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. key
和 code
之间的关系
key
-
key
属性是为那些对按下的键的含义感兴趣的用户设计的, 需要考虑到当前的键盘布局(和IME; 死键被赋予一个唯一的key
值)。使用例子: 检测修饰键或的基本的修饰键(例如, 响应键盘快捷键以执行操作)。 code
-
code
属性适用于对用户按下的键感兴趣的用户, 而不考虑任何布局修饰。使用例子: 检测 WASD 键(例如,用于游戏中的移动控制) 或捕获所有键(例如,在远程桌面客户端中,将所有键发送到远程主机)。
6.2.3. code
例子
美式键盘布局: 标准 "101" 键盘布局;
日式键盘布局: 日式 "106" 键盘布局;
美式国际键盘布局: 备用 "101" 键盘布局;
英式键盘布局: 标准 "102" 键盘布局。
键盘布局 | 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"
),
而无需担心当前正在使用的键盘布局。
请注意,在法语示例中, Alt
和 AltGraph
键保留其左右位置( code
值仍然是 "AltLeft"
和 "AltRight"
),
即使每个键只有一个。
键盘布局 | KeyboardEvent key
| KeyboardEvent code
| 注释 |
---|---|---|---|
美式 | "'"
| "Quote"
| |
日式 | ":"
| "Quote"
| |
美式国际 | "Dead"
| "Quote"
|
"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"
。
Shift
和 2
比较下面列出的两个(顺序不同)按键事件序列的属性值。它们都在美国键盘上产生 "@"
字符,但按键释放的顺序不同。在第一个序列中,顺序为: 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
|
在第二个序列中, Shift
在 2
之前释放,
从而产生以下事件顺序: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"
键的 keydown
和 keyup
事件之间的 key
属性值不匹配。 code
属性提供了一个不受当前修饰键状态影响的一致值。
6.2.4. code
和虚拟键盘
code
属性的用处对于虚拟键盘(以及遥控器和和弦键盘)
来说不太明显。通常,如果虚拟(或遥控器)键盘模仿标准键盘的布局和功能,
则它还 必须 适当地设置 code
属性。对于不模仿标准键盘布局的键盘,则 code
属性 可以 设置为标准键盘上最接近的匹配项,也 可以 未定义。
对于具有变化值特性的按键的虚拟键盘(这些按键根据某些修饰键状态产生不同的值), code
值应该是在设备处于出厂重置状态时按下按键(button)
时产生的 key
值。
6.3. 键盘事件 key
属性值
键值是一个 DOMString
,它可以用来表示(indicate)
键盘上的任何给定键,无论其位置或状态如何,通过它产生的值(来表示按键)。这些键值 可以 用作实现生成的键盘事件的返回值,
或者用作内容作者指定期望得到的输入(例如键盘快捷键)的输入值。
有效 key
值的列表在 [UIEvents-Key] 中定义。
通过使用 key
属性,键值被用于检测已按下的键的值。
内容作者可以检索大写或小写字母、数字、符号或其他产生字符的键的 字符值 ,也可以检索控制键、修饰符键、
功能键或其他不产生字符的按键的 键值 。
这些值可以用于: 监控特定的输入字符串; 用于检测和作用于结合了其他输入(例如鼠标)
的修饰键输入; 用于创建虚拟键盘; 或用于任何数量的其他目的。
键值也可以由内容作者在字符串比较中使用,能作为符合规范的 宿主语言 的标记属性
(如 HTML 的 accesskey
)的值,或用于其他相关目的。符合规范的 宿主语言 应当 允许内容作者使用两个等价字符串值中的任意一个作为键值: 字符值 或 键值 。
虽然独立于平台或键盘布局映射的实现将使用键的最相关值,
但内容作者不能对键盘设备生成它们的能力做出假设。
当使用键盘事件和快捷键组合的键值时,内容作者可以 考虑使用数字和功能键(
( [DWW95] ),
因为大多数键盘布局都会为这些键值提供键。 F4
、 F5
等)而不是字母
键值并不标识(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
键帽标签的键(通常通过 location
值 DOM_KEY_LOCATION_LEFT
和 DOM_KEY_LOCATION_RIGHT
区分)或 8
键帽标签的键(通常由 location
值 DOM_KEY_LOCATION_STANDARD
和 DOM_KEY_LOCATION_NUMPAD
区分),并且用户配置的自定义键盘布局 可以 在多个键状态(multiple key-state)
场景中复用任何键值(请注意,location
只用于标准键盘布局,
并且不总能指示出有意义的区别)。
最后,任何( key
)给定的字符表示(representation)
的含义都是上下文相关的并且复杂的。例如,在某些上下文中,星号(星形)字形( "*"
)表示脚注或强调(将一段文字括起来时)。然而,在一些文档或可执行程序中,
它相当于数学乘法运算,而在其他文档或可运行程序中,该功能键预留为乘法符号( "×"
,Unicode 值 U+00D7
)或小写拉丁字母 "x"
(由于许多键盘上没有乘法键,而且字形 "×"
和 "x"
表面上很相似)。
这样,字符表示(representation)的语义或功能不在本规范的论述范围内。
6.3.1. 修饰符按键
键盘输入使用修饰键来更改键的正常行为。与其他按键一样,修饰符按键生成 keydown
和 keyup
事件,如下面的例子所示。
某些修饰符在按键被按下或保持按下时被激活,如 Alt
、 Control
、 Shift
、 AltGraph
或 Meta
。
其他修饰符会根据其状态激活,例如 CapsLock
、 NumLock
或 ScrollLock
。当按下修饰键时,(这些按键对应的修饰)状态会发生变化。 KeyboardEvent
接口为一些常见的修饰符键提供了方便的属性: ctrlKey
、 shiftKey
、 altKey
、 metaKey
。
某些操作系统使用 AltGraph
和 Control
修饰键的组合来模拟 AltGraph
修饰键。鼓励实现使用 AltGraph
修饰符按键。
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 |
事件类型 | KeyboardEvent key
| 修饰符 | 注释 | |
---|---|---|---|---|
1 | keydown
| "Control"
| ctrlKey
| |
2 | keydown
| "v"
| ctrlKey
| 小写拉丁字母 V |
不生成 beforeinput 或 input 事件。
| ||||
3 | keyup
| "v"
| ctrlKey
| 小写拉丁字母 V |
4 | keyup
| "Control"
|
Ctrl
+ v
是粘贴的快捷组合键,
用户将剪贴板的内容粘贴到输入控件。无论剪贴板是否包含复制的内容,在 键盘事件测试网站 上测试, 谷歌浏览器 (113.0.5672.129(正式版本) (64 位))都会派发 beforeinput
和 input
事件,而 火狐浏览器 (113.0.2(64位))只在剪贴板有内容时才派发 beforeinput
和 input
事件。当然,如果组合键的第二个按键不是
v
,而是非快捷组合按键,如 i
,则两个浏览器就如例子所述都不会触发 beforeinput
和 input
事件。因此,在考虑实际的事件发生情况时,
要将修饰按键和字符数字按键组合形成组合按键纳入考虑范围。
Shift
和 Control
时的事件序列:
事件类型 | KeyboardEvent key
| 修饰符 | 注释 | |
---|---|---|---|---|
1 | keydown
| "Control"
| ctrlKey
| |
2 | keydown
| "Shift"
| ctrlKey , shiftKey
| |
3 | keydown
| "V"
| ctrlKey , shiftKey
| 大写拉丁字母 V |
不生成 beforeinput 或 input 事件。
| ||||
4 | keyup
| "V"
| ctrlKey , shiftKey
| 大写拉丁字母 V |
5 | keyup
| "Shift"
| ctrlKey
| |
6 | keyup
| "Control"
|
beforeinput
或 input
事件的生成情况和例子23中的 注释 说明的情况一致,Ctrl
+ Shift
+ v
组合按键仍然有粘贴的功能。除此之外,还有考虑加入 Shift
后浏览器可能的其它快捷键对浏览器事件派发的影响,例如 Ctrl
+ Shift
+ i
组合快捷键可以打开浏览器的开发者工具(devTool),打开后可能会阻止 keyup
事件的后续派发。 事件类型 | KeyboardEvent key
| 修饰符 | 注释 | |
---|---|---|---|---|
1 | keydown
| "Control"
| ctrlKey
| |
2 | keydown
| "ر"
| ctrlKey
| 阿拉伯字母 Reh |
不生成 beforeinput 或 input 事件。
| ||||
3 | keyup
| "ر"
| ctrlKey
| 阿拉伯字母 Reh |
4 | keyup
| "Control"
|
当按键按下时,触发的 keydown
和 keyup
事件中的值根据当前的键盘布局变化。这意味着美式布局上的 v
键和阿拉伯布局上的 ر
键将生成(具有)不同(键值)的事件,
即使它们是相同的物理键。要将这些事件标识为来自同一个物理键,您需要使用 code
属性。
在某些情况下, 修饰键 会更改键事件的 key
值。例如,在一些 MacOS 键盘上,标签为 "delete"
的键在未修饰(unmodified)时的功能与 Windows 操作系统上的 Backspace
键相同,但当被 Fn
键修饰后,它充当 Delete
键,并且 key
的值将与当前修饰符状态下按键的最合适功能相匹配。
6.3.2. 死键
它是电脑键盘或打字机上一种特殊的快捷键。 它们通常用来对原始的拉丁字母加上附加符号。死键并不会输出一个完整的字母, 而是改变下一个按下的键的输出结果。 因此不需要为每一个字母与每一个标音的组合都对应一个单独的键; 只要为每一个标音对应一个死键便足够。举例来说,若键盘上有一个重音符(—— 维基百科 死键 。`
)的死键,要输出法文字母 à 只需要先按下`
,再按下A
。如果是 è 则是先按下`
再按下 E 。而通常来说,通过键入`
与"Space"
可以产生一个单独的标音符号。
基本上,美式标准键盘没有任何死键, 所以沿用这种键盘的中国大陆地区使用的键盘也没有死键, 但是世界上大多数地区销售的键盘都有一个AltGraph
(Alternative graphic)键,它可以直接修改一些字母,并将其他字母变成死键 (取决于键盘设置)。旧的计算机系统,如 MSX ,通常有一个标记为死键的特殊键, 它与—— 维基百科 Dead keyCtrl
键和Shift
键相结合, 可以用来将西欧语言中常见的一些变音符号(´
、`
、ˆ
和¨
)添加到随后键入的元音中。
一些键盘输入使用 死键 来输入合成字符序列(composed
character sequences)。与在手写序列(见 § 5.7.3 手写识别系统 )中,用户可以首先输入基本字符不同,键盘输入需要在按下 死键 时进入特殊状态,并且只有在输入有限数量的 合法(legal)
基本字符中的一个时才发出(emit)字符。
MacOS 和 Linux 操作系统使用输入法来处理 死键 。
死键 (在所有键盘布局和映射中)由键值 "Dead"
表示。
为了响应任何死键的按下,合成事件 必须由用户代理派发,并且 compositionupdate
事件的 data
值必须是死键组合序列的当前状态的字符值。
虽然 Unicode 组合字符 总是遵循手写顺序 —— 组合字符在相应的字母后面,
但典型的死键输入 可以 颠倒顺序 ——U+0302
(组合扬抑音符(Combining Circumflex Accent)键)和 U+0065
(用小写拉丁字母 E 作为标签的键)很可能会产生
(在使用法语映射且未激活任何修饰符的法语键盘上) Unicode 字符 "ê"
(带扬抑符(Circumflex)的小写拉丁字母 E ),这是 Unicode 规范化形式
(Unicode Normalization Form) NFC 的首选。
◌̂
),分音符(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
属性获取。此外, 输入法 系统和设备的功能各不相同,
其中那些用于激活这些功能的按键,例如 Convert
和 Accept
键 可以 由其他可用键表示。
键盘事件就是(correspond to)输入设备在键盘布局映射之后生成的事件。
在某些实现或系统配置中,某些按键事件或其值可能会被使用中的 输入法 阻止(suppressed)。
以下示例描述了使用日语输入法生成 Unicode 字符 "市"
(汉字,CJK
统一象形文字的一部分) 的可能的按键序列。
此示例假设输入法编辑器已激活并处于日语罗马字(Japanese-Romaji)输入模式。
根据使用的输入设备和 IME 的配置, Convert
和 Accept
键 可以 被其他键取代,例如,
它可以分别为 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"
。
这些键的功能在本规范中没有定义 —— 有关 输入法编辑器 功能的详细信息,请参阅其他资源。
具有 输入法编辑器 功能的键不限于此目的(激活输入法功能, 更输入法模式),还可以具有其他特定于设备或实现的目的。
6.3.4. 默认行为和可取消的键盘事件
取消 keydown
事件的 默认行为 不得 影响其相应的 keyup
事件,但 必须 防止生成相应的 beforeinput
和 input
(以及 keypress
,如果支持的话)事件。
以下示例描述了在使用美式映射的美式键盘上生成 Unicode 字符 Q (大写拉丁字母Q)
的可能按键序列:
事件类型 | KeyboardEvent key
| InputEvent data
| 修饰符 | 注释 | |
---|---|---|---|---|---|
1 | keydown
| "Shift"
| shiftKey
| ||
2 | keydown
| "Q"
| shiftKey
| 默认行为 被阻止,即通过调用 preventDefault() 。
| |
没有 beforeinput 或 input (或 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"
|
如果该键是多个击键(keystrokes)的序列的一部分,无论它是 死键 ,还是促成了输入法编辑器的序列,只有在 keydown
事件的 默认行为 被取消时,
该击键才 必须 被忽略(即不将其纳入考虑)。
取消 死键 的 keyup
事件,对 beforeinput
或 input
事件没有影响。
以下示例使用法语键盘上的死键 "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),以便完全初始化事件。
在某种程度上,因为制定本标准的时间过长,一些实现 可以 依赖于这些(现在已弃用)初始化器方法。 为了保持规范的完整性,这些遗留事件初始化器在本附录(Appendix)中进行描述说明。
用这种方式初始化事件必须是由——createEvent()
方法创建的实例。 初始化器方法必须在事件被触发之前调用(用dispatchEvent()
派发)。 一旦被派发,事件便不再做其他任何事。
7.1. 遗留事件初始化器接口
本节是信息性的(informative)
本节介绍了本规范早期版本中引入的遗留初始化器方法(initializer methods)。
7.1.1. UIEvent 接口的初始化器
partial interface UIEvent { // Deprecated in this specificationundefined 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 specificationundefined 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 specificationundefined 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 benull
. - DOMString modifiersListArg
- 要在此事件对象上激活的修饰符键值的 空白(white space) 分隔列表。
例如,
"Control Shift"
将控制和换挡修饰符标记为已激活 ( 继承自ctrlKey
和shiftKey
的属性在初始化的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 specificationundefined (
initKeyboardEvent DOMString ,
typeArg optional boolean =
bubblesArg false ,optional boolean =
cancelableArg false ,optional Window ?=
viewArg null ,optional DOMString = "",
keyArg optional unsigned long = 0,
locationArg optional boolean =
ctrlKey false ,optional boolean =
altKey false ,optional boolean =
shiftKey false ,optional boolean =
metaKey false ); };
initKeyboardEvent()
-
初始化一个
KeyboardEvent
对象的属性。此方法具有与UIEvent.initUIEvent
相同的行为。 The value ofdetail
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 specificationundefined 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
属性,而不是 charCode
和 keyCode
属性。
不管怎样,为了记录这些特性的现状及其与规范的事件和属性的关系, 本节提供了有用的信息性(informative)描述。对于支持这些属性和事件的实现, 建议使用本节中提供的定义。
8.1. 遗留的 UIEvent
补充接口
本节内容不是规范的
用户代理 传统上包括 which
属性,以便 KeyboardEvent
和 MouseEvent
事件们可以记录补充的(supplemental)
事件信息。
本规范的早期版本直接在 KeyboardEvent
和 MouseEvent
上定义了单独的 which
属性,而不是在 UIEvent
上定义共享 which
属性。
8.1.1. UIEvent 接口(补充)
部分(partial) UIEvent
接口是 UIEvent
接口的信息性扩展,它添加了 which
属性。
partial interface UIEvent { // The following support legacy user agentsreadonly attribute unsigned long which ; };
which
, of type unsigned long, readonlywhich
,unsigned 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 to0
which
,unsigned long
类型(32位无符号整型),默认值为0
- 初始化
UIEvent
的which
属性。
8.2. 遗留的 KeyboardEvent
补充接口
本节内容不是规范的
浏览器对键盘的支持在传统依赖于三个特殊(ad-hoc)属性: keyCode
, charCode
, 和 UIEvent
的 which
。
这三个属性都返回一个数字码,表示按下的键的某一方面(some aspect): keyCode
是键本身的索引。 charCode
是字符键的 ASCII 值。 which
是可用的字符值(同),否则是键索引
(通常和 keyCode
相同)。这些属性的值以及属性的可用性在平台、
键盘语言和布局、 用户代理 、
版本甚至事件类型之间都不一致。
事件类型之间都不一致指
charCode
只在遗留的 keypress
事件中有值,其它键盘事件类型中默认为 0
,因为 keypress
只会在 DOM 发生更新时触发(即击键确定是一个字符按键,
而不是功能,修饰,菜单或其它按键),这能确保按键有对应的字符值,即 charCode
才有效。此外,现代浏览器的
keydown
和
EVENTE{keyup} 的 keyCode
和 which
属性的值总是相同(即等于键本身的索引),而在同一次击键中可能触发的 keypress
事件的 keyCode
, which
总是和 charCode
属性值相同(即等于字符键的 ASCII 值),
这就导致了一次击键中 这些属性的值甚至在
事件类型之间都不一致的情况。可以访问 https://domeventviewer.com/key-event-viewer.html 自己测试。
8.2.1. KeyboardEvent 接口(补充)
部分(partial) KeyboardEvent
接口是 KeyboardEvent
接口的信息性
(informative)扩展,它添加了 charCode
和 keyCode
属性。
部分(partial) KeyboardEvent
接口可以通过在支持此扩展的实现中调用 createEvent()
方法调获得(obtained)。
partial interface KeyboardEvent { // The following support legacy user agentsreadonly attribute unsigned long charCode ;readonly attribute unsigned long keyCode ; };
charCode
, of type unsigned long, readonlycharCode
,unsigned long
类型(32位无符号整型),只读-
charCode
保存一个字符值,在字符输入触发的keypress
事件中有效。该值是该字符的 Unicode 参考数字 (code point,码点)(即对于可打印(printable)字符,event.charCode = event.key.charCodeAt(0)
)。对于keydown
或keyup
事件,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
中的 keyCode
和 charCode
支持的浏览器也应将以下成员添加到 KeyboardEventInit
字典中。
部分(partial) KeyboardEventInit
字典是 KeyboardEventInit
字典的信息性扩展,它添加了 charCode
和 keyCode
以初始化对应的 KeyboardEvent
属性成员。
partial dictionary KeyboardEventInit { // The following support legacy user agentsunsigned long charCode = 0;unsigned long keyCode = 0; };
charCode
, of type unsigned long, defaulting to0
charCode
,unsigned long
类型(32位无符号整型),默认值为0
- 将
KeyboardEvent
的charCode
属性初始化为事件字符的 Unicode 码点(code point)。 character. keyCode
, of type unsigned long, defaulting to0
keyCode
,unsigned long
类型(32位无符号整型),默认值为0
- 将
KeyboardEvent
的keyCode
属性初始化为与系统和实现相关的数字码(numerical code), 它表示与按下的键相关的未修饰(unmodified)时的标识符。
8.3. 遗留按键模型
本节内容不是规范的
对于不同的事件类型,不同实现选择暴露(exposed)出的事件属性的值会有区别。
实现 可以 选择在 keyCode
属性中公开虚拟键码(key codes)和字符码(character codes)(即 合并模型
(conflated model) ),或者报告单独的 keyCode
和 charCode
属性(即 拆分模型(split model) )。
8.3.1. 如何确定 keydown
和 keyup
事件的 keyCode
keydown
或 keyup
事件的 keyCode
计算方式如下:
-
从操作系统的事件信息中读取虚拟键码(key codes)(如果这些信息可用的话)。
-
如果输入法编辑器正在处理按键输入,并且事件是
keydown
,则返回229。 -
如果在没有修饰键的情况下按下输入键会插入数字字符(0-9), 则返回该数字字符的 ASCII 码。
-
如果在没有修饰键的情况下按下输入键会从 a-z 字母表范围中选择一个小写字符插入,则返回对应大写字符的 ASCII 码。
-
如果实现支持操作系统和平台规定的键码转换表,请查找该值。 如果转换表为给定的输入指定了供选择的(alternate)虚拟键值,则返回指定的值。
-
如果按键的功能(由实现指定的方式确定)对应于 § 8.3.3 固定虚拟键码 表中一个按键,则返回相应的键码(key code)。
-
返回从操作系统中获取的虚拟键码(key code)。
-
如果未找到键码(key code),则返回0。
8.3.2. 如何确定 keypress
事件的 keyCode
-
如果实现支持 合并模型(conflated model) ,请将
keyCode
设置为所输入字符的 Unicode 码点(code point)。 -
如果实现支持 拆分模型(split model) ,设置
keyCode
为 0 。
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
| 能 | 能 | 多种: 启动 文本合成系统; (触发) blur 和 focus 事件; (触发) DOMActivate 事件; (触发)其它事件
|
9.1. 遗留 UIEvent
事件
9.1.1. 遗留 UIEvent
事件类型
9.1.1.1. DOMActivate
类型 | DOMActivate
|
---|---|
接口 | UIEvent
|
同步 / 异步 | 同步 |
冒泡 | 能 |
可信目标对象 | Element
|
可取消 默认行为 | 能 |
能否从Shadow DOM冒泡传递 | 能 |
默认行为 | 没有 |
上下文 (可信事件) |
当按钮、链接或其他状态可更改的元素被激活时, 用户代理 必须 派发此事件。查阅 § 3.5 激活触发器和行为 以获取更多详细信息。
为了(规范的)参考引用和完整性,本规范中定义了 DOMActivate
事件类型 ,但本规范 反对(deprecates) 使用此事件类型,
而赞成使用相关的 click
事件类型。为了向后兼容,其他规范 可以 定义并维护自己的DOMActivate
事件类型 。
虽然 DOMActivate
和 click
并不完全等同,但 click
事件类型的实现行为已经发展到包括 DOMActivate
事件类型 设计时考虑的最关键的无障碍
(accessibility)方面,并得到了更广泛的实现。鼓励内容作者使用 click
事件类型,而不是相关的 mousedown
或 mouseup
事件类型,
以确保最大程度的可访问性(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 事件的) 默认行为 ,包括 激活行为
|
9.2. 遗留 FocusEvent
事件
9.2.1. 遗留 FocusEvent
事件类型
9.2.1.1. DOMFocusIn
类型 | DOMFocusIn
|
---|---|
接口 | FocusEvent
|
同步 / 异步 | 同步 |
冒泡 | 能 |
可信目标对象 | Window , Element
|
可取消 默认行为 | 否 |
能否从Shadow DOM冒泡传递 | 能 |
默认行为 | 没有 |
上下文 (可信事件) |
|
当 事件对象 接收焦点时 用户代理 必须 派发此事件。 事件对象 必须 在此事件类型被派发前接收焦点
此事件类型 必须 在 focus
事件类型之后被派发。
为了(规范的)参考引用和完整性,本规范中定义了 DOMFocusIn
事件类型 ,但本规范 反对(deprecates) 使用此事件类型,
而赞成使用相关的 focus
和 focusin
事件类型。
9.2.1.2. DOMFocusOut
类型 | DOMFocusOut
|
---|---|
接口 | FocusEvent
|
同步 / 异步 | 同步 |
冒泡 | 能 |
可信目标对象 | Window , Element
|
可取消 默认行为 | 否 |
能否从Shadow DOM冒泡传递 | 能 |
默认行为 | 没有 |
上下文 (可信事件) |
|
当 事件对象 失去焦点时, 用户代理 必须 派发此事件。焦点 必须 在派发此事件之前从 事件对象 上丢失(taken)。此事件类型 必须 在 blur
事件类型之后被派发。
为了(规范的)参考引用和完整性,本规范中定义了 DOMFocusOut
事件类型 ,但本规范 反对(deprecates) 使用此事件类型,
而赞成使用相关的 blur
和 focusout
事件类型。
9.2.2. 遗留焦点事件(FocusEvent)事件顺序
以下是焦点在元素之间转移时的典型事件序列,包括不推荐使用的 DOMFocusIn
和 DOMFocusOut
事件。所示的顺序假定最初没有元素被聚焦。
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
| 如果支持(才派发此事件) |
DOMFocusIn
和 DOMFocusOut
事件了,而谷歌浏览器(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
事件的代码通常依赖于遗留的 charCode
、 keyCode
和 which
属性。
请注意, keypress
事件是特定于按键事件的,并且已被 beforeinput
和 input
事件的更通用的事件序列所取代(见 § 5.6.3 键盘事件顺序 )。这些新的 input
事件不是特定于键盘操作的,并且可以用于捕获用户输入,而不管原始(触发)源是什么。
9.3.1. 遗留 KeyboardEvent
事件类型
9.3.1.1. keypress
类型 | keypress
|
---|---|
接口 | KeyboardEvent
|
同步 / 异步 | 同步 |
冒泡 | 能 |
可信目标对象 | Element
|
可取消 默认行为 | 能 |
能否从Shadow DOM冒泡传递 | 能 |
默认行为 | 多种:
启动 文本合成系统;
(触发) blur 和 focus 事件;
(触发) 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, nullablerelatedNode
,Node
类型,只读,可为空-
relatedNode
必须 用于标识与突变事件相关的次级(secondary)节点。例如, 如果一个突变事件被派发到一个节点,指示其父节点已经更改了,那么relatedNode
将是更改了的父节点。 如果一个事件被派发到了一个子树,指示其中的一个节点发生了更改,那么relatedNode
必须 是那个更改了的节点。在派发的事件是DOMAttrModified
的情况下, 它指示被修改、添加或删除的Attr
节点。 该属性的 未初始化值 该属性的 未初始化值 必须 是null
。 prevValue
, of type DOMString, readonlyprevValue
,DOMString
类型,只读-
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
事件的更改类型。这些值可以是MODIFICATION
、ADDITION
或REMOVAL
。该属性的 未初始化值 必须 是
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冒泡传递 | 否 |
默认行为 | 没有 |
上下文 (可信事件) |
|
在修改了一个 Element
的 Attr.value
之后以及在一个 Element
上添加或删除一个 Attr
节点之后 用户代理 必须 派发此事件。
事件的 事件对象 必须 是发生了改变的 Element
节点。当 Attr
节点的子节点以不影响 Attr.value
值的方式更改时,是否会发生此事件类型取决于实现。
为了(规范的)参考引用和完整性,本规范中定义了 DOMAttrModified
事件类型 ,但本规范 反对(deprecates) 使用此事件类型。
9.4.2.2. DOMCharacterDataModified
类型 | DOMCharacterDataModified
|
---|---|
接口 | MutationEvent
|
同步 / 异步 | 同步 |
冒泡 | 能 |
可信目标对象 | Text , Comment , ProcessingInstruction
|
可取消 默认行为 | 否 |
能否从Shadow DOM冒泡传递 | 否 |
默认行为 | 没有 |
上下文 (可信事件) |
|
修改 CharacterData.data
或 ProcessingInstruction.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)层次。
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 |
在撰写本文时的 github 提交的记录信息是
Gary Kacmarcik, 7年前 (3 5th, 2016 1:56 凌晨)。不过这个表格中的前缀列对老版本浏览器的实现特定的 CSS 属性前缀的使用理解有帮助。
11. 安全注意事项
本附录讨论了用户界面事件实现的安全注意事项。 讨论仅限于由本规范中定义的概念可能直接引起的安全问题,这些概念包括事件模型的实现 、APIs 和事件。实现(Implementations)通常支持其他功能,如脚本语言、其他 APIs 和本文档中未定义的其他事件。这些功能构成不可预知的要素,超出了本规范的范围。 实现人员 应当 查阅上述种种功能的规范, 以了解其各自的安全注意事项。
本规范中定义的许多事件类型都是响应用户操作而被派发的。 这使得恶意 事件监听器 能够访问用户通常认为是隐私 (confidential)的信息,例如,用户在填写表单时可能犯的拼写错误, 如果用户在提交表单前不久重新考虑对多选问题的回答,用户的打字率或主要输入机制。 在最坏的情况下,恶意 事件监听器 可以捕获所有用户交互,并通过 DOM 实现中通常可用的方法(如 XMLHttpRequest 接口, 本规范未定义这些方法)将其提交给第三方。
在支持加载外部数据的设备(facilities)的 DOM 实现中,像 error
这样的事件可以提供对关于计算机系统或网络的环境相关的敏感信息的访问。
例如,一个恶意 HTML 文档试企图将资源嵌入本地网络或本地主机的不同端口。
然后,嵌入式 DOM 应用程序 可以监听 error
和 load
事件,
以确定网络中的哪些其他计算机可以从本地系统访问,或者系统上的哪些端口是打开的,
从而为进一步的攻击做好准备。
仅支持用户界面事件的实现通常不足以执行此类攻击,
并且可能支持此类攻击的设备的安全注意事项也适用。为了符合本规范,
DOM 实现 可以 采取合理的步骤来确保 DOM 应用程序 不会访问隐私或敏感信息。例如,
它们可能会选择不将 load
事件分派发给企图在本地网络上嵌入资源的节点。
12. 变化
12.1. 从 DOM Level 2 Events 到 UI Events 的更改
(本规范)已经对接口和事件类型进行了大量分类(clarifications)。
本规范文档中不再定义 HTMLEvents
模块。 focus
和 blur
事件已添加到 UIEvent
模块, dblclick
事件已添加至 MouseEvent
模块。本新规范在 DOM 事件流、事件类型和 DOM
接口之间提供了更好的分隔(separation)。
12.1.1. 对 DOM Level 2 事件流的更改
本新规范在事件流中引入了以下新概念:
12.1.2. 对 DOM Level 2 事件类型的更改
(本规范)已经对事件类型进行了大量分类(clarifications)。一致性(conformance) 现在是针对事件类型明确定义的,而不仅仅是根据事件类型使用的接口。
"MutationEvents"
已被遗弃。在本规范的早期草案中,
对命名空间事件(namespaced events)的支持也被删除了。
对于支持 DOMNodeInserted
和 DOMNodeRemoved
事件类型的用户代理
,此规范不再要求为 Attr
节点触发此事件类型。
resize
事件类型不再冒泡, mousemove
事件现在是可取消
(默认行为)的,以反映(reflect)现有的实现。
12.1.3. 对 DOM Level 2 接口的更改
Event
接口-
-
Event
接口有一个新属性defaultPrevented
和一个新方法stopImmediatePropagation()
。 -
timeStamp
现在是 ECMAScript 绑定中的一个数字(Number
)。即将提出一项修正建议,对 [DOM-Level-3-Core] 进行同样的更改。
-
EventTarget
接口-
-
dispatchEvent()
方法已被修改。
-
MouseEvent
接口-
-
MouseEvent
接口有一个新方法getModifierState()
。
-
EventException
异常-
-
本规范中删除了异常
EventException
。先前的DISPATCH_REQUEST_ERR
代码被重新映射到InvalidStateError
类型的DOMException
。
-
12.1.4. 新接口
接口 CustomEvent
, FocusEvent
, KeyboardEvent
, CompositionEvent
和 WheelEvent
已添加到事件(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 的构造中进行了显著的重新排序。新的图表已经(阐述)到位, 可以更清晰地表示层次结构和事件流。以下是一些草案之间的更重要的变化:
-
键标识符(key identifier)
功能已被重命名为
键值(key value)
, 以消除它们与键的唯一标识符之间的歧义。键的唯一标识符是码值(code value)
。 -
KeyboardEvent
接口(从 2003-2010 年开始)被短暂地定义具有keyIdentifier
和keyLocation
属性过, 但为了支持当前的key
和location
属性, 这些属性被删除了。并且这些属性没有得到广泛的实现。 -
KeyboardEvent
和CompositionEvent
接口定义了一个locale
属性。该属性未被充分指定,并被移到技术说明中,直到可以充分指定为止。 有关详细信息,请参阅此 旧版本的用户界面事件(在 DOM3Events 规范被重命名为"UI Events"之前)。 -
KeyboardEvent
还有一个仅由keypress
事件使用的char
属性。由于keypress
事件已被弃用,因此该属性不再有用,已被删除。 -
change
、submit
和reset
事件被删除 ,因为它们是特定于 HTML 表单的,并且在 [HTML5] 中规定。 -
最初被提议作为
keypress
替代的textInput
事件被删除, 取而代之的是当前的beforeinput
和input
事件。 -
已删除命名空间(Namespaced)事件。
-
已更新为使用 [WebIDL] 。
这里指接口的定义方式遵循 [WebIDL] 规范 。 -
EventException 已被删除。
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
接口的输入设备(如鼠标滚轮或触摸板)的物理移动, 用户代理将滚动或缩放页面,对这种滚动或缩放页面的滚动量 (以像素、行或页为单位)估计就称为 delta 。 delta 的值(例如,deltaX
、deltaY
或deltaZ
属性)将在当前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
事件类型与mouseover
或load
类型具有不同的特性。 事件类型作为事件对象上的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)键盘、中文键盘等)的因素,并且还将所有 修饰按键 (
Shift
、Alt
等)和 死键 的状态纳入考虑因素。 - 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 树从一个节点到另一个节点的逻辑遍历集,即 从 Window 到
Document
对象、 根元素 ,直到 事件目标 ( 捕获阶段 )前继续向下遍历,然后传到 事件目标 本身( 目标阶段 ),最后按照相反方向向上遍历同一个节点链 ( 冒泡阶段 )。 - 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()
进行过初始化的事件的属性 (例如bubbles
,currentTarget
)的值。 一个新事件通过使用createEvent()
方法创建后, 这个事件的属性会立即应用未初始化值。 - user agent
-
用户代理,是一个程序,例如浏览器或内容创作工具,通常在客户端机器运行, 它代理用户对内容进行检索、解释、执行、呈现或创建。出于不同的目的, 用户可以在不同的时间使用不同的用户代理对内容进行操作。请参阅 § 1.2.1 Web 浏览器和其他动态或交互式的 用户代理 和 § 1.2.3 内容作者和内容 ,以获得 符合(conforming) 要求(规范)的用户代理的详细信息。
- Window
-
Window
引用当前文档的浏览上下文的窗口代理对象 (Window Proxy object),窗口代理对象在 HTML5 [HTML5] 中定义。