触摸事件 - 第二级

最终社区组报告

本版本:
https://www.w3.org/community/reports/touchevents/CG-FINAL-touch-events-20240704/
最新已发布版本:
https://www.w3.org/community/reports/touchevents/CG-FINAL-touch-events-20240704/
最新编辑草案:
https://w3c.github.io/touch-events/
编辑:
Doug Schepers (W3C)
Sangwhan Moon (Opera Software ASA)
Matt Brubeck (Mozilla)
Arthur Barstow (受邀专家)
Rick Byers (Google)
Patrick H. Lauke (TetraLogical)
代码仓库
我们在 GitHub 上。
提交错误报告。
提交历史。
邮件列表。

本文档状态

本规范由 Touch Events Community Group 发布。它既不是 W3C 标准,也不在 W3C 标准化进程上。 请注意,根据 W3C Community Final Specification Agreement (FSA) 的规定,适用其他条件。 了解更多关于 W3C Community and Business Groups 的信息。

本规范由 Touch Events Community Group 发布。它既不是 W3C 标准,也不在 W3C 标准化进程上。

请注意,根据 W3C Community Final Specification Agreement (FSA) 的规定,适用其他条件。

本版本的规范包含对 Touch Events Level 1 的修复和改进,并合并了先前作为 Touch Event Extensions 发布的功能。

注意

目前并无继续推进 Touch Events 的后续工作的计划。此文档已被维护以反映自原始 Touch Events Level 1 规范发布以来在用户代理中所做的新增与更改。社区组将 Touch Events 视为遗留(legacy)API —— 强烈建议作者改用 Pointer Events

摘要

触摸事件规范定义了一组低级事件,用于表示与触摸敏感表面的一处或多处接触点,以及这些接触点相对于该表面及显示在其上的任何 DOM 元素(例如触摸屏)或与其关联的元素(例如没有显示屏的绘图板)的变化。它还涵盖了诸如绘图板之类的笔式平板设备,并考虑到手写笔(stylus)的能力。

1. 引言

本节为非规范性内容。

在为 Web 应用提供触控输入的终端上运行的用户代理通常使用解释得到的鼠标事件,以便让用户能够访问交互式的 Web 应用。然而,这些被解释出来的事件作为基于物理触控输入的归一化数据,往往在实现预期的用户体验方面存在局限。此外,由于鼠标事件的限制(包括系统级限制和为向后兼容而保留的行为),无法处理并发输入(不论设备能力如何)。

同时,本地应用程序可以通过提供的系统 API 处理上述两种情况。

触摸事件规范通过指定接口,使 Web 应用能够直接处理触摸事件以及支持多点触控的设备上的多个触控点,从而为该问题提供了解决方案。

2. 一致性

除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性。规范中的其他部分均为规范性内容。

文档中关键词 MUST 的含义应按 BCP 14 [RFC2119] [RFC8174] 所述的方式来解释,但仅当该关键词以全部大写形式出现时,如本文中所示。

本规范定义的符合性准则适用于单一产品:实现了本规范所含接口的用户代理。

WindowProxy 在 [HTML5] 中有定义。

2.1 WebIDL 一致性

本规范中的 IDL 代码块为 WebIDL 规范 [WEBIDL] 定义的符合要求的 IDL 片段。

一个符合规范的用户代理还必须是该 IDL 片段在本规范中所述的 符合要求的 JavaScript 实现,但有以下例外:

注意:这两种反映 IDL 属性的方式都允许在平台对象上直接读取和设置该属性。举例来说,给定一个 Touch 对象 aTouch,计算 aTouch.target 应返回该 Touch 对象的 EventTarget。如果用户代理将 IDL 属性实现为访问器属性,则属性访问会调用 getter 并返回该 EventTarget。如果用户代理将 IDL 属性实现为具有与访问器属性相同行为的数据属性,则该对象将看起来具有一个名为 target 的自有属性,其值为一个 EventTarget 对象,属性访问将返回该值。

3. Touch 接口

该接口描述了触摸事件中的单个 触控点Touch 对象为不可变对象;创建之后,其属性不得更改。

WebIDLenum TouchType {
    "direct",
    "stylus"
};

dictionary TouchInit {
    required long        identifier;
    required EventTarget target;
             double      clientX = 0;
             double      clientY = 0;
             double      screenX = 0;
             double      screenY = 0;
             double      pageX = 0;
             double      pageY = 0;
             float       radiusX = 0;
             float       radiusY = 0;
             float       rotationAngle = 0;
             float       force = 0;
             double      altitudeAngle = 0;
             double      azimuthAngle = 0;
             TouchType   touchType = "direct";
};

[Exposed=Window]
interface Touch {
    constructor(TouchInit touchInitDict);
    readonly        attribute long        identifier;
    readonly        attribute EventTarget target;
    readonly        attribute double      screenX;
    readonly        attribute double      screenY;
    readonly        attribute double      clientX;
    readonly        attribute double      clientY;
    readonly        attribute double      pageX;
    readonly        attribute double      pageY;
    readonly        attribute float       radiusX;
    readonly        attribute float       radiusY;
    readonly        attribute float       rotationAngle;
    readonly        attribute float       force;
    readonly        attribute float       altitudeAngle;
    readonly        attribute float       azimuthAngle;
    readonly        attribute TouchType   touchType;
};
identifier

为每个 触控点 指定的标识编号。

当一个触控点变为活动状态时,必须为其分配一个与任何其他 活动触控点 不同的 identifier。在该触控点保持活动状态期间,所有引用它的事件必须为其分配相同的 identifier

target

触控点首次放置在表面时所触发的 EventTarget,即使该触控点此后已移出该元素的交互区域,target 仍为最初的那个元素。

注意

某些实现会更改目标元素以纠正粗糙输入的不精确性。因此,目标元素不一定是事件坐标处直接的元素。用于定位/消歧义粗糙输入的方法超出本规范的范围。

screenX

相对于屏幕的点的水平坐标,单位为像素

screenY

相对于屏幕的点的垂直坐标,单位为像素

clientX

相对于视口的点的水平坐标,单位为像素,不包括任何滚动偏移

clientY

相对于视口的点的垂直坐标,单位为像素,不包括任何滚动偏移

pageX

相对于文档(视口加上滚动偏移)的点的水平坐标,单位为像素

pageY

相对于文档(视口加上滚动偏移)的点的垂直坐标,单位为像素

radiusX

沿由 rotationAngle 指示的轴,最接近包围触摸区域(例如手指、手写笔)的椭圆的半径,单位为与 screenX 相同尺度的 CSS 像素(参见 [CSS-VALUES]);若未知则为 0。该值不得为负。

radiusY

沿与 rotationAngle 指示的轴垂直方向,最接近包围触摸区域(例如手指、手写笔)的椭圆的半径,单位为与 screenY 相同尺度的 CSS 像素(参见 [CSS-VALUES]);若未知则为 0。该值不得为负。

rotationAngle

radiusXradiusY 描述的椭圆绕其中心顺时针旋转的角度(单位为度);若未知则为 0。该值必须大于或等于 0 且小于 90

如果由 radiusXradiusY 描述的椭圆为圆形,则 rotationAngle 无效。用户代理可以在此情况下使用 0 作为值,或使用允许范围内的任意其他值。(例如,用户代理可以使用前一个触摸事件的 rotationAngle 值,以避免出现突变。)

force

相对压力值,范围为 01,其中 0 表示无压力,1 表示触摸设备能够感知的最高压力;若未知则为 0。在可以获得压力值的环境中,force 所表示的绝对压力值及压力灵敏度等级可能有所不同。

altitudeAngle

传感器(例如笔/手写笔)相对于表面的仰角(以弧度计),范围为 [0, π/2] —— 其中 0 表示平行于表面(X-Y 平面),π/2 表示垂直于表面。对于不报告倾斜或角度的硬件和平台,该值 MUST 为 0。

注意
此处为 altitudeAngle 定义的默认值为 0。该默认值不同于 Pointer Events - Level 3 规范 [POINTEREVENTS] 对 altitudeAngle 属性的定义,该规范将默认值定义为 π/2,即将传感器位置视为垂直于表面。
altitudeAngle 说明图
Figure 1 例如 altitudeAngle 为 π/4(相对于 X-Y 平面 45 度)。
azimuthAngle

传感器(例如笔/手写笔)在 X-Y 平面上的方位角(以弧度计),范围为 [0, 2π] —— 其中 0 表示笔帽指向 X 轴增大的方向(如果从上方俯视,则相当于“3 点钟”方向),数值在顺时针方向上递增(π/2 在“6 点钟”,π 在“9 点钟”,3π/2 在“12 点钟”)。当传感器与表面完全垂直(即 altitudeAngle 为 π/2)时,该值 MUST 为 0。对于不报告倾斜或角度的硬件和平台,该值 MUST 为 0。

azimuthAngle 说明图
Figure 2 例如 azimuthAngle 为 π/6(相当于“4 点钟”方向)。
touchType

触发该触摸的设备类型。

TouchType

表示不同触摸输入类型的枚举。

direct

来自屏幕上手指的直接触摸。

stylus

来自手写笔或笔式设备的触摸。

4. TouchList 接口

该接口定义了触摸事件的各个接触点列表。TouchList 对象为不可变;创建之后,其内容不得更改。

TouchList 对象的 支持的属性索引([WEBIDL])为从 0 到列表长度减一的数字范围。

WebIDL[Exposed=Window]
interface TouchList {
    readonly        attribute unsigned long length;
    getter Touch? item (unsigned long index);
};
length

返回列表中 Touch 对象的数量

item

返回列表中指定索引处的 Touch,如果索引不小于列表长度则返回 null。

5. TouchEvent 接口

该接口定义了 touchstarttouchendtouchmovetouchcancel 事件类型。TouchEvent 对象为不可变;创建并初始化之后,其属性不得更改。TouchEvent 继承自 [DOM-LEVEL-3-EVENTS] 中定义的 UIEvent 接口。

TouchEventInit 字典由 TouchEvent 接口的构造函数使用,提供一种构造不受信任(合成)触摸事件的机制。它继承自 [DOM-LEVEL-3-EVENTS] 中定义的 EventModifierInit 字典。事件构造的步骤在 [DOM4] 中定义。参见示例(示例)了解如何触发非受信任触摸事件的示例代码。

WebIDLdictionary TouchEventInit : EventModifierInit {
            sequence<Touch> touches = [];
            sequence<Touch> targetTouches = [];
            sequence<Touch> changedTouches = [];
};

[Exposed=Window]
interface TouchEvent : UIEvent {
    constructor(DOMString type, optional TouchEventInit eventInitDict = {});
    readonly        attribute TouchList touches;
    readonly        attribute TouchList targetTouches;
    readonly        attribute TouchList changedTouches;
    readonly        attribute boolean   altKey;
    readonly        attribute boolean   metaKey;
    readonly        attribute boolean   ctrlKey;
    readonly        attribute boolean   shiftKey;
    getter boolean getModifierState (DOMString keyArg);
};
touches

列出当前接触表面的每个触点的 Touch 对象。

targetTouches

列出每个既接触表面又起始于当前事件目标元素的 Touch 对象。

changedTouches

列出对该事件有贡献的每个接触点的 Touch 对象。

对于 touchstart 事件,该属性必须为在当前事件中刚变为活动状态的触点列表。对于 touchmove 事件,该属性必须为自上一个事件以来已移动的触点列表。对于 touchendtouchcancel 事件,该属性必须为刚从表面移除的触点列表,并包含这些触点被移除前的最后已知坐标。

altKey

如果 alt(Alternate)键修饰符已激活,则为 true;否则为 false

metaKey

如果 meta(Meta)键修饰符已激活,则为 true;否则为 false。在某些平台上,该属性可能映射到名称不同的键修饰符。

ctrlKey

如果 ctrl(Control)键修饰符已激活,则为 true;否则为 false

shiftKey

如果 shift(Shift)键修饰符已激活,则为 true;否则为 false

getModifierState(keyArg)

使用键值查询修饰符的状态。如果是修饰键且该修饰符已激活则返回 true,否则返回 false

5.1 TouchEvent 实现者注释

本节为非规范性内容。

注意

用户代理应确保从给定的 Touch 对象在同一 TouchEvent 被分派到的文档中关联。为实现此点,用户代理应维护当前的 “touch-active” 文档的概念。首次触摸时,将此文档设置为触摸创建时的目标文档。当所有活动触点释放后,清除该 “touch-active” 文档。所有 TouchEvent 都应分派到当前的 “touch-active” 文档,并且其中包含的每个 Touch 对象只引用该文档中的 DOM 元素(及坐标)。如果一个触摸完全在当前的 “touch-active” 文档之外开始,则应完全忽略该触摸。

5.2 使用示例

本节为非规范性内容。

下面的示例演示了在 TouchList 成员之间的关系,这些成员在 TouchEvent 中定义。

5.2.1 touchestargetTouches(用于 TouchEvent

该示例演示了 TouchEvent 接口中 touchestargetTouches 成员之间的用途和关系。下面的代码将根据触摸元素和文档上触点的数量生成不同的输出:

<div id="touchable">This element is touchable.</div>

<script>
document.getElementById('touchable').addEventListener('touchstart', function(ev) {

    if (ev.touches.item(0) == ev.targetTouches.item(0))
    {
        /**
         * If the first touch on the surface is also targeting the
         * "touchable" element, the code below should execute.
         * Since targetTouches is a subset of touches which covers the
         * entire surface, TouchEvent.touches >= TouchEvents.targetTouches
         * is always true.
         */

        document.write('Hello Touch Events!');
    }

    if (ev.touches.length == ev.targetTouches.length)
    {
        /**
         * If all of the active touch points are on the "touchable"
         * element, the length properties should be the same.
         */

        document.write('All points are on target element')
    }

    if (ev.touches.length > 1)
    {
        /**
         * On a single touch input device, there can only be one point
         * of contact on the surface, so the following code can only
         * execute when the terminal supports multiple touches.
         */

        document.write('Hello Multiple Touch!');
    }

}, false);
</script>

5.2.2 changedTouches(用于 TouchEvent

该示例演示了 changedTouches 的用法及其与 TouchList 中其他成员的关系。代码示例在定义的可触元素上有触点被移除时触发:

<div id="touchable">This element is touchable.</div>

<script>
document.getElementById('touchable').addEventListener('touchend', function(ev) {

    /**
     * Example output when three touch points are on the surface,
     * two of them being on the "touchable" element and one point
     * in the "touchable" element is lifted from the surface:
     *
     * Touch points removed: 1
     * Touch points left on element: 1
     * Touch points left on document: 2
     */

    document.write('Touch points removed: ' + ev.changedTouches.length);
    document.write('Touch points left on element: ' + ev.targetTouches.length);
    document.write('Touch points left on document: ' + ev.touches.length);

}, false);
</script>

5.2.3 从脚本触发合成的 TouchEvent

该示例演示如何在脚本中创建并触发一个 TouchEvent

if (Touch.length < 1 || TouchEvent.length < 1)
  throw "TouchEvent constructors not supported";

var touch = new Touch({
    identifier: 42,
    target: document.body,
    clientX: 200,
    clientY: 200,
    screenX: 300,
    screenY: 300,
    pageX: 200,
    pageY: 200,
    radiusX: 5,
    radiusY: 5
});

var touchEvent = new TouchEvent("touchstart", {
    cancelable: true,
    bubbles: true,
    composed: true,
    touches: [touch],
    targetTouches: [touch],
    changedTouches: [touch]
});

document.body.dispatchEvent(touchEvent);

5.3 TouchEvent 类型列表

本节为非规范性内容。

下面的表格概述了本规范中定义的 TouchEvent 事件类型。所有事件均应在冒泡阶段发生。所有事件均应为合成 [WHATWG-DOM] 事件。

事件类型 同步 / 异步 是否冒泡 是否 composed 受信任的近端事件目标类型 接口 是否可取消 默认操作
touchstart 同步 Document, Element TouchEvent 视情况而定 未定义
touchend 同步 Document, Element TouchEvent 视情况而定 视情况而定:用户代理可分派 鼠标和 click 事件
touchmove 同步 Document, Element TouchEvent 视情况而定 未定义
touchcancel 同步 Document, Element TouchEvent

5.4 触摸事件的可取消性

取消(Canceling)触摸事件可以阻止或以其他方式中断滚动(滚动可能与脚本执行并行发生)。为获得最大的滚动性能,用户代理可能不会等待与滚动相关的每个触摸事件都被处理以查看它是否会被取消。在这种情况下,用户代理应生成其 cancelable 属性为 false 的触摸事件,表明不能使用 preventDefault 来阻止或中断滚动。否则,cancelable 将为 true

特别地,当用户代理 观察到事件没有非被动侦听器 时,用户代理应只生成不可取消的触摸事件。

5.5 touchstart 事件

用户代理必须分派此事件类型以指示用户何时在触摸表面上放置了一个 触点

该事件的目标必须是一个 Element。如果触点位于一个框架内,事件应分派到该框架的子浏览上下文中的某个元素。

如果该事件被 取消,则应阻止与同一 活动触点 相关的任何触摸事件所导致的默认操作,包括鼠标事件或滚动。

5.6 touchend 事件

用户代理必须分派此事件类型以指示用户何时从触摸表面移除了一个 触点,也包括触点物理离开触摸表面的情况,例如被拖出屏幕。

该事件的目标必须是触点首次放置在表面时所处的相同 Element,即使触点此后已移出目标元素的交互区域。

被移除的触点必须包含在 changedTouches 属性中,并且不得包含在 touchestargetTouches 属性中。

如果该事件被 取消,则任何包含该事件的触摸事件序列都不得被 解释为点击

5.7 touchmove 事件

用户代理必须分派此事件类型以指示用户何时沿触摸表面移动了一个 触点

该事件的目标必须是触点首次放置在表面时所处的相同 Element,即使触点此后已移出目标元素的交互区域。

注意,用户代理发送 touchmove 事件的频率由实现决定,可能依赖于硬件能力和其他实现细节。

用户代理应当在至少有一个与同一 活动触点 相关的 touchmove 事件没有被 取消 之前,应当压制该 touchmove 事件所导致的默认操作。是否在至少有一个与同一活动触点相关的 touchmove 事件未被取消之后继续压制默认操作,属于实现决定。

5.8 touchcancel 事件

用户代理必须分派此事件类型以指示触点以实现定义的方式被中断,例如由 UA 发起的同步事件或操作取消了触摸,或触点离开文档窗口进入能够处理用户交互的非文档区域(例如 UA 的本机用户界面或由插件管理的文档区域)。当用户在触摸表面上放置的触点数超过设备或实现配置所能存储的数量时,用户代理也可分派此事件,在这种情况下,Touch 列表中最早的 TouchList 条目应被移除。

该事件的目标必须是触点首次放置在表面时所处的相同 Element,即使触点此后已移出目标元素的交互区域。

被移除的触点必须包含在 changedTouches 属性中,并且不得包含在 touchestargetTouches 属性中。

6. 重定目标

下面的部分描述了在 [WHATWG-DOM] 中定义的 重定目标步骤

Touch 对象具有一个关联的 unadjustedTarget(null 或 EventTarget)。除非另有说明,否则其为 null。

TouchEvent重定目标步骤(给定一个 touchEvent)必须执行以下步骤:

  1. 对于 touchEventtouchestargetToucheschangedTouches 成员中的每个 Touch 对象 touch

    1. 如果 touchunadjustedTarget 为 null,则将其设置为 touchtarget
    2. touchtarget 设置为对 touchunadjustedTarget 针对 touchEventtarget 执行 retargeting 后的结果。

7. 有条件地暴露遗留触摸事件 API

用户代理具有一个关联的布尔值 expose legacy touch event APIs,其值为 implementation-defined

注意

现有的 Web 内容常常将这些 API 的存在作为用户代理为触摸支持的“移动”设备的信号,因此即便是在可触摸的非移动设备上也暴露这些 API,可能会导致此类 Web 内容的用户体验不佳。

8. GlobalEventHandlers mixin 的扩展

下面的部分描述了对定义于 [HTML5] 的现有 GlobalEventHandlers mixin 的扩展,以便于事件处理器的注册。对于 expose legacy touch event APIs 为 false 的用户代理,不得实现此 mixin。

WebIDLpartial interface mixin GlobalEventHandlers {
                    attribute EventHandler ontouchstart;
                    attribute EventHandler ontouchend;
                    attribute EventHandler ontouchmove;
                    attribute EventHandler ontouchcancel;
};
ontouchstart

用于 touchstart 事件类型的事件处理器 IDL 属性(参见 [HTML5])。

ontouchend

用于 touchend 事件类型的事件处理器 IDL 属性(参见 [HTML5])。

ontouchmove

用于 touchmove 事件类型的事件处理器 IDL 属性(参见 [HTML5])。

ontouchcancel

用于 touchcancel 事件类型的事件处理器 IDL 属性(参见 [HTML5])。

9. 与鼠标事件及 click 的交互

用户代理可能会针对同一用户输入同时分派触摸事件和(为与未针对触摸设计的 Web 内容兼容)鼠标事件 [DOM-LEVEL-2-EVENTS]。如果用户代理在对单个用户操作响应时同时分派触摸事件和鼠标事件,则必须在该操作的任何鼠标事件类型之前分派 touchstart 事件。如果 touchstarttouchmovetouchend取消,则用户代理不应分派任何因被阻止的触摸事件而导致的后续鼠标事件。

注意

如果 Web 应用可以处理触摸事件,它可以 取消这些事件,那么用户代理无需分派相应的鼠标事件。若 Web 应用并未专门为触摸输入设备编写,则会改为对随后产生的鼠标事件作出反应。

注意

用户代理通常仅在单指激活手势(如点按和长按)时分派鼠标和 click 事件。涉及触点移动或多点交互(两个或更多个 活动触点)的手势通常只会生成触摸事件。

如果用户代理将一系列触摸事件解释为点击手势,则应在相应触摸输入的 touchend 事件的位置依次分派 mousemovemousedownmouseupclick 事件(按此顺序)。如果在处理触摸事件期间文档内容发生了变化,用户代理可以将鼠标事件分派到与触摸事件不同的目标。

除非另有规定,任何后续触摸和鼠标事件的默认操作和顺序由实现决定。

注意

激活一个元素(例如,在某些实现中,点按)通常会产生以下事件序列(但具体用户代理行为可能略有不同):

  1. touchstart
  2. 根据手指移动情况产生零个或多个 touchmove 事件
  3. touchend
  4. mousemove (用于与旧的鼠标专用代码兼容)
  5. mousedown
  6. mouseup
  7. click

然而,如果在此交互过程中任一 touchstarttouchmovetouchend 事件被 取消,则不会触发鼠标或 click 事件,事件序列将仅为:

  1. touchstart
  2. 根据手指移动情况产生零个或多个 touchmove 事件
  3. touchend
注意

即使用户代理支持 Touch Events,这也不意味着触摸屏是用户可用的唯一输入机制。尤其是在触摸支持的笔记本,或带有外接输入设备的传统“仅触摸”设备(如手机和平板)中,用户可能会将触摸屏与触控板、鼠标或键盘一起使用。因此,开发者应避免使用“触摸或鼠标/键盘”的条件绑定事件监听器,因为这会导致站点/应用仅限触摸,阻止用户使用其他输入方式。


// conditional "touch OR mouse/keyboard" event binding
// DON'T DO THIS, as it makes interactions touch-exclusive
// on devices that have both touch and mouse/keyboard

if ('ontouchstart' in window) {
  // set up event listeners for touch
  target.addEventListener('touchend', ...);
  ...
} else {
  // set up event listeners for mouse/keyboard
  target.addEventListener('click', ...);
  ...
}

相反,开发者应并发地处理不同形式的输入。


// concurrent "touch AND mouse/keyboard" event binding

// set up event listeners for touch
target.addEventListener('touchend', function(e) {
  // prevent compatibility mouse events and click
  e.preventDefault();
  ...
});
...

// set up event listeners for mouse/keyboard
target.addEventListener('click', ...);
...

为避免对同一次交互处理两次(一次为触摸事件,一次为兼容鼠标事件),开发者应确保 取消触摸事件,从而抑制任何后续鼠标或 click 事件的生成。或者,可参见 InputDeviceCapabilities API,该 API 提供了一种检测由触摸事件生成的鼠标事件的方法。

10. 术语表

活动触点
当前位于屏幕上并由用户代理跟踪的触控点。当用户代理首次分派指示其出现的touchstart事件时,该触点变为活动状态。在用户代理分派指示该触点已从表面移除或不再被跟踪的touchendtouchcancel事件后,该触点不再处于活动状态。
触控点
指针(例如手指或手写笔)与目标表面相交的坐标点。该术语可用于描述手指触摸触摸屏,或数字笔在纸面上书写时与表面的交点。
已取消事件
通过调用 preventDefault()、在事件处理器中返回 false,或按 [DOM-LEVEL-3-EVENTS] 和 [HTML5] 定义的其他方法阻止其默认操作的事件。

A. 致谢

本节为非规范性内容。

非常感谢 WebKit 工程师开发了作为本规范基础的模型,感谢 Neil Roberts(SitePen)对 WebKit 触摸事件的总结,感谢 Peter‑Paul Koch(PPK)的撰文和建议,感谢 Robin Berjon 开发了 ReSpec.js 规范编写工具),以及感谢 WebEvents 工作组的诸多贡献。

在规范制定过程中还有许多人提出了额外的意见,促成了不断改进。其中包括 Matthew Schinckel、Andrew Grieve、Cathy Chan、Boris Zbarsky、Patrick H. Lauke 和 Simon Pieters。如果我们不慎遗漏了您的名字,请告知。

本小组感谢下列人员为本规范测试套件做出的贡献:Matt Brubeck、Olli Pettay、Art Barstow、Cathy Chan 与 Rick Byers。

B. 自上次发布以来的更改

本节为非规范性内容。

下文是自 2013 年 10 月 10 日 Recommendation 发布以来所做主要更改的摘要。完整的 提交历史 亦可查阅。

C. 参考文献

C.1 规范性参考文献

[CSS-VALUES]
CSS Values and Units Module Level 3. Tab Atkins Jr.; Elika Etemad. W3C. 22 March 2024. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-values-3/
[DOM-LEVEL-2-EVENTS]
Document Object Model (DOM) Level 2 Events Specification. Tom Pixley. W3C. 3 November 2020. W3C Recommendation. URL: https://www.w3.org/TR/DOM-Level-2-Events/
[DOM-LEVEL-3-EVENTS]
UI Events. Gary Kacmarcik; Travis Leithead. W3C. 22 June 2024. W3C Working Draft. URL: https://www.w3.org/TR/uievents/
[DOM4]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[html]
HTML Standard. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[HTML5]
HTML5. Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Theresa O'Connor; Silvia Pfeiffer. W3C. 27 March 2018. W3C Recommendation. URL: https://www.w3.org/TR/html5/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

C.2 说明性参考文献

[POINTEREVENTS]
Pointer Events. Jacob Rossi; Matt Brubeck. W3C. 4 April 2019. W3C Recommendation. URL: https://www.w3.org/TR/pointerevents/