Clipboard API 和事件

W3C 工作草案,

关于此文档的更多细节
此版本
https://w3org.cn/TR/2025/WD-clipboard-apis-20251124/
最新发布版本
https://w3org.cn/TR/clipboard-apis/
编辑草案
https://w3c.github.io/clipboard-apis/
历史版本
历史
https://w3org.cn/standards/history/clipboard-apis/
反馈
GitHub
文档内联
编辑
(Microsoft)
(Microsoft)
前任编辑
(Google)
(Microsoft)
(Mozilla)
(Microsoft)
说明文档
异步剪贴板 API 说明文档

摘要

本文档描述了用于访问系统剪贴板数据的 API。它提供了覆盖默认剪贴板操作(剪切、复制和粘贴)的功能,以及直接访问剪贴板内容的方法。

关于本文档

本节描述了本文件发布时的状态。当前的 W3C 出版物列表和本技术报告的最新版本可以在 W3C 标准和草案索引中找到。

本文档由 Web 编辑工作组作为工作草案,根据推荐标准轨道发布。作为工作草案发布并不意味着得到 W3C 及其成员的认可。

这是一个草案文档,可能随时会被其他文档更新、替换或废弃。将其作为进展中的工作之外的任何内容进行引用是不恰当的。

本文档的变更可在 https://github.com/w3c/clipboard-apis 追踪。

本文档由在 W3C 专利政策下运作的组织制作。W3C 维护了一份与该组织交付成果相关的专利披露公开列表;该页面还包含了披露专利的说明。任何知悉其认为包含必要权利要求 (Essential Claim(s)) 的专利的个人,必须按照 W3C 专利政策第 6 节披露相关信息。

本文件受 2025 年 8 月 18 日 W3C 流程文件的管辖。

1. 简介

本节是非规范性的。

本规范定义了 Web 应用程序如何访问系统剪贴板。

本规范描述了两种通用的 API:

2. 用例

本节是非规范性的。

2.1. 更改默认剪贴板操作

在许多场景下,需要更改默认的剪贴板操作(剪切/复制/粘贴)。以下是一些例子:

2.2. 远程剪贴板同步

对于与远程设备通信的 Web 应用程序(例如远程访问或远程 Shell 应用程序),通常需要在两个设备之间保持剪贴板数据同步。

此用例的一个重要方面是,它需要在没有用户手势或交互的情况下访问剪贴板。

要将远程设备上的剪贴板数据复制到本地剪贴板,Web 应用程序会获取远程剪贴板数据,然后使用 write() 将数据写入本地剪贴板。
要将本地剪贴板数据复制到远程设备,Web 应用程序会监听 clipboardchange 事件,每当剪贴板更新时从剪贴板 read() 数据,然后将新的剪贴板数据发送到远程设备。

2.3. 触发剪贴板操作

为用户代理提供替代接口的应用程序有时需要能够触发用户代理中的剪贴板操作。

例如,考虑一个为标准 Web 浏览器提供更易访问接口的屏幕阅读器应用程序。虽然阅读器可以显示内容并允许用户与之交互,但剪贴板复制等操作需要在底层浏览器中执行,以确保剪贴板内容被正确设置(包括浏览器在复制时添加的任何元数据)。

3. 术语

术语 可编辑上下文 (editable context) 指的是任何属于 编辑宿主 (editing host) 的元素、textarea 元素,或者 type 属性设置为 "text"、"search"、"tel"、"url"、"email"、"password" 或 "number" 的 input 元素。

4. 模型

平台提供一个 系统剪贴板 (system clipboard)

系统剪贴板拥有一个 系统剪贴板项目 (system clipboard item) 列表,统称为 系统剪贴板数据 (system clipboard data)

每个 系统剪贴板项目 拥有一个 系统剪贴板表示 (system clipboard representation) 列表。

每个 系统剪贴板表示 都有一个 名称(字符串)和 数据(字节序列)。

5. 剪贴板事件

5.1. 剪贴板事件接口

ClipboardEvent 接口扩展了 Event 接口。

dictionary ClipboardEventInit : EventInit {
  DataTransfer? clipboardData = null;
};
clipboardData

一个用于保存与事件相关的数据和元数据的 DataTransfer 对象。

[Exposed=Window]
interface ClipboardEvent : Event {
  constructor(DOMString type, optional ClipboardEventInit eventInitDict = {});
  readonly attribute DataTransfer? clipboardData;
};
clipboardData

clipboardData 属性是 DataTransfer 接口的一个实例,它允许脚本在用户发起的复制、剪切和粘贴操作期间读取和操作系统剪贴板上的值。关联的拖拽数据存储是系统剪贴板的一个实时但经过过滤的视图,公开了实现认为脚本可以安全访问的 强制数据类型。对于合成事件,拖拽数据存储包含由创建该事件的脚本添加的数据。

clipboardData 对象的 itemsfiles 属性支持处理剪贴板中的多部分或非文本数据。

该接口可用于 构建事件。下面给出一个示例:

var pasteEvent = new ClipboardEvent('paste');
pasteEvent.clipboardData.items.add('My string', 'text/plain');
document.dispatchEvent(pasteEvent);

注意:合成剪贴板事件实际上不会修改剪贴板或文档。换句话说,虽然上述脚本会触发粘贴事件,但数据不会粘贴到文档中。

5.2. 剪贴板事件

5.2.1. The clipboardchange 事件

clipboardchange 事件在 系统剪贴板的内容发生变化时触发。这些变化可能源于以下任何原因(不限于此):

5.2.1.1. 触发 clipboardchange 事件

给定 Document document触发 clipboardchange 事件

  1. 如果 document 没有 粘性激活 (sticky activation)document 没有从剪贴板读取的权限,则返回。

  2. globaldocument相关全局对象

  3. 如果 document 具有 系统焦点 (system focus)

    1. types系统剪贴板上可用的 强制数据类型列表。

    2. changeId 为运行 生成 changeId(给定 document)的结果。

    3. eventInit 为一个新的 ClipboardChangeEventInit 字典,其 types 成员设置为 types,其 changeId 成员设置为 changeId

    4. global触发名为 clipboardchange 的事件,使用 ClipboardChangeEventeventInit

  4. 如果 document 不具有 系统焦点

    1. documentclipboardchange 挂起标志 设置为 true。

用户代理可以选择跳过为那些在事件发送前已被更新的剪贴板变化触发 clipboardchange 事件。这种优化可以提高性能,特别是在剪贴板变化非常频繁的场景下,因为发送过时的变更通知对 Web 应用程序没有任何价值,且会消耗处理资源。

5.2.1.2. 文档焦点步骤

Document document 获得 系统焦点

  1. 如果 documentclipboardchange 挂起标志 为 true

    1. documentclipboardchange 挂起标志 设置为 false。

    2. types系统剪贴板上可用的 强制数据类型列表。

    3. changeId 为运行 生成 changeId(给定 document)的结果。

    4. eventInit 为一个新的 ClipboardChangeEventInit 字典,其 types 成员设置为 types,其 changeId 成员设置为 changeId

    5. globaldocument相关全局对象

    6. global触发名为 clipboardchange 的事件,使用 ClipboardChangeEventeventInit

对于嵌套浏览上下文中的文档,clipboardchange 事件根据各自的焦点状态在每个 Document 中独立触发。剪贴板变化将仅在拥有 系统焦点的文档中触发事件(如果该文档具有 粘性激活或持久性剪贴板权限)。

注意:`clipboardchange` 事件仅在粘性激活之后可用,除非文档具有从剪贴板读取的持久权限。在支持持久性剪贴板权限的用户代理中,拥有此类权限的站点可以在没有粘性激活的情况下接收 `clipboardchange` 事件,因为该权限已经授予了对更敏感剪贴板数据的访问权限。

changeId 为每个剪贴板变化操作提供唯一标识符。对于相同的剪贴板变化,所有具有相同 存储键 (storage key) 的窗口和标签页将收到具有相同 changeId 值的事件,使拥有多个窗口的应用程序能够对事件进行去重并避免冗余处理。该标识符特定于 存储键,不提供跨 存储键 的关联能力。

clipboardchange 事件不会冒泡且不可取消,因为它不是由用户操作触发的,而是由 系统剪贴板状态的变化触发的。

dictionary ClipboardChangeEventInit : EventInit {
  sequence<DOMString> types = [];
  bigint changeId = 0;
};
types

表示 系统剪贴板上可用 强制数据类型DOMString 序列。

changeId

表示剪贴板变化操作唯一标识符的 bigint

[Exposed=Window]
interface ClipboardChangeEvent : Event {
  constructor(DOMString type, optional ClipboardChangeEventInit eventInitDict = {});
  readonly attribute FrozenArray<DOMString> types;
  readonly attribute bigint changeId;
};
types

返回一个 FrozenArrayDOMString 对象,指示事件触发时 系统剪贴板上可用的 强制数据类型可选数据类型和自定义格式被排除在外,以限制指纹识别表面。

changeId

返回一个表示此特定剪贴板变化操作唯一标识符的 bigint。对于相同的剪贴板变化,该标识符在所有具有相同 存储键 的窗口和标签页中是一致的,使应用程序能够在多个窗口收到相同的剪贴板变化通知时对事件进行去重。

changeId 是一个加密衍生的 128 位整数。唯一的保证是,在向剪贴板写入内容后,changeId 将产生一个与写入操作前不同的值。

5.2.1.3. ClipboardChangeEvent 构造函数步骤

ClipboardChangeEvent(type, eventInitDict) 构造函数步骤为:

  1. this.types 设置为 eventInitDict["types"] 的一个 克隆

  2. this.changeId 设置为 eventInitDict["changeId"]。

5.2.1.4. ChangeId 生成

给定 Document document生成 changeId

  1. globalChangeId 为用户代理特定的唯一标识符,代表 系统剪贴板的当前状态。该标识符在 系统剪贴板每次被修改时改变,并在用户代理重启时重置。

  2. storageKey 为运行 obtain a storage key for non-storage purposes(给定 document相关设置对象)的结果。

  3. storageKeyBytesstorageKey 的某种用户代理特定的二进制表示。

  4. hashedValue 为对 globalChangeId(作为字节)和 storageKeyBytes 的连接应用加密哈希函数(例如 SHA-256)的结果。

  5. 返回一个从 hashedValue 衍生的 128 位整数(例如,取哈希输出的前 128 位)。

上述算法确保来自相同源且具有相同分区的文档,针对相同的剪贴板修改收到相同的更改 ID,从而实现跨多个窗口和标签页的正确事件去重,同时防止可能用于追踪的跨分区关联。随着客户端存储分区 (Client-side Storage Partitioning) 的变更被纳入存储键定义,此方法将自动在分区之间提供匿名化处理。

changeId 不会在浏览器重启后持续存在,因为 globalChangeId 计数器在用户代理重启时会重置。同样,当用户清除站点数据时,受影响的标签页应刷新,这会导致事件监听器被重新绑定,并仅在以后接收带有新更改 ID 的事件。

由于合成 cutcopy 事件不会更新 系统剪贴板,它们不会触发 "clipboardchange" 事件。

clipboardchange 事件使 Web 应用程序能够高效监控剪贴板变化,并根据可用数据格式提供动态用户界面。// For applications with multiple windows, track processed change IDs to avoid duplication const processedChangeIds = new Set(); // Listen for clipboard changes navigator.clipboard.addEventListener('clipboardchange', (e) => { // Deduplicate events across multiple windows using changeId if (processedChangeIds.has(e.changeId)) { return; // This change has already been processed } processedChangeIds.add(e.changeId); // Check what data types are available on the clipboard const hasText = e.types.includes('text/plain'); const hasHTML = e.types.includes('text/html'); const hasImage = e.types.includes('image/png'); // Update UI based on available formats document.getElementById('paste-text-btn').disabled = !hasText; document.getElementById('paste-html-btn').disabled = !hasHTML; document.getElementById('paste-image-btn').disabled = !hasImage; // For remote desktop apps, sync clipboard to remote only once per change if (hasText || hasHTML || hasImage) { syncClipboardToRemote(e.changeId); } }); // Alternatively, you can use the onclipboardchange property // navigator.clipboard.onclipboardchange = (e) => { ... };

这种基于事件的方法比使用 read()readText() 等方法轮询剪贴板更高效,并且适用于那些需要用户激活才能访问剪贴板的浏览器,因为 UI 可以即时响应剪贴板变化,无需等待定时器触发。changeId 对于具有多个窗口的应用程序特别有用,确保每个剪贴板变化在所有具有相同 存储键 的窗口中仅被处理一次。

5.2.2. The copy 事件

当用户发起复制操作时,用户代理会触发一个名为 copy 的剪贴板事件。

如果该事件未被取消,当前选中的数据将被复制到 系统剪贴板。当前的文档选区不受影响。

copy 事件会冒泡,可取消,且是组合事件 (composed)。

有关此事件处理模型的详细说明,请参阅 § 8.1 copy 操作

合成的 copy 事件可以手动构建和分发,但不会影响 系统剪贴板的内容。

5.2.3. The cut 事件

当用户发起剪切操作时,用户代理会触发一个名为 cut 的剪贴板事件。

可编辑上下文中,如果事件未被取消,该操作会将当前选中的数据放置在 系统剪贴板上,并从文档中删除该选区。cut 事件在选中数据被删除之前触发。当剪切操作完成时,选区将被折叠。

在非 可编辑上下文中,clipboardData 将是一个空列表。请注意,即使在这种情况下,cut 事件仍会被触发。

cut 事件会冒泡,可取消,且是组合事件。

有关此事件处理模型的详细说明,请参阅 § 8.2 cut 操作

合成的 cut 事件可以手动构建和分发,但不会影响文档或 系统剪贴板的内容。

5.2.4. The paste 事件

当用户发起粘贴操作时,用户代理会触发一个名为 paste 的剪贴板事件。该事件在任何剪贴板数据被插入文档之前触发。

如果光标位于 可编辑上下文中,粘贴操作将以给定上下文支持的最合适格式(如有)插入剪贴板数据。

粘贴操作在非 可编辑上下文中无效,但 paste 事件仍会触发。

paste 事件会冒泡,可取消,且是组合事件。

有关此事件处理模型的详细说明,请参阅 § 8.3 paste 操作

合成的 paste 事件可以手动构建和分发,但不会影响文档内容。

5.3. 与其他脚本和事件的集成

5.3.1. Event handlers that are 允许修改剪贴板

如果以下任何条件为真,事件处理程序可以向剪贴板写入数据:

如果实现作者认为某些其他受信任的事件类型可能表达了用户意图,则实现可以允许这些事件类型修改剪贴板。实现还可以支持配置,即信任特定的站点或应用修改剪贴板,无论脚本线程的来源如何。

合成的 cutcopy 事件不得修改系统剪贴板上的数据。

5.3.2. Event handlers that are 允许从剪贴板读取

如果以下任一条件为真,事件处理程序可以从系统剪贴板读取数据:

合成的 paste 事件不得让脚本访问真实的系统剪贴板数据。

5.3.3. 与富文本编辑 API 的集成

如果实现支持通过脚本执行剪贴板命令的方式(例如调用带有 "cut"、"copy" 和 "paste" 命令的 document.execCommand() 方法),则实现必须触发相应的操作,这会再次分发相关的剪贴板事件。

通过脚本 API 触发复制、剪切或粘贴操作时,应遵循以下步骤:

  1. 同步执行相应的操作。

  2. 将操作的返回值作为 API 调用的返回值。

注意:只有在事件是从受信任且由用户触发的操作分发时,或者实现配置为允许时,通过脚本 API 触发的复制和剪切命令才会影响真实剪贴板的内容。只有在实现配置为允许时,通过脚本 API 触发的粘贴命令才会触发粘贴事件并提供对剪贴板内容的访问。如何配置实现以允许读取或写入剪贴板超出了本规范的范围。

5.3.4. 与其他事件的交互

如果剪贴板操作由键盘输入触发,实现必须触发启动剪贴板操作的对应事件。该事件是异步的,但必须在相关按键的 keyup 事件之前分发。

剪切和粘贴操作可能导致实现分发其他支持的事件,例如 textInput、input、change、验证事件、DOMCharacterDataModified 和 DOMNodeRemoved / DOMNodeInserted。任何此类事件都会被排队,并在剪切/粘贴事件的处理完成后触发。

实现不得在响应复制操作时分发其他输入相关的事件,如 textInput、input、change 和验证事件。

5.3.5. 修改选区或焦点的事件监听器

如果事件监听器修改了选区或 可聚焦区域,则剪贴板操作必须在修改后的选区上完成。

6. 剪贴板事件 API

剪贴板事件 API 允许您覆盖用户代理的默认剪切、复制和粘贴行为。

对剪贴板的访问是通过标准的 DataTransfer 方法来完成的,以改变 ClipboardEventclipboardData 属性上的 items。一个结果是,这些剪贴板 API 只能在 ClipboardEvent 处理程序的上下文中访问剪贴板数据。

注意:如果您需要在剪贴板事件处理程序之外访问剪贴板,请参阅 § 7 异步剪贴板 API

注意:剪贴板事件 API 是同步的,因此它们能做的事情有限。这些 API 不支持潜在阻塞的操作(如请求权限或对图像进行转码)。请参阅 § 7 异步剪贴板 API,以了解支持阻塞或其他耗时操作的更强大 API。

6.1. 覆盖 copy 事件

要覆盖默认的 copy 事件行为,必须添加一个 copy 事件处理程序,并且该处理程序必须调用 preventDefault() 来取消该事件。

取消该事件是必要的,以便使用 clipboardData 中的数据更新 系统剪贴板。如果 ClipboardEvent 未被取消,则会改用当前文档选区中的数据进行复制。

// Overwrite what is being copied to the clipboard.
document.addEventListener('copy', function(e) {
  // e.clipboardData is initially empty, but we can set it to the
  // data that we want copied onto the clipboard.
  e.clipboardData.setData('text/plain', 'Hello, world!');
  e.clipboardData.setData('text/html', '<b>Hello, world!</b>');

  // This is necessary to prevent the current document selection from
  // being written to the clipboard.
  e.preventDefault();
});

6.2. 覆盖 cut 事件

要覆盖默认的 cut 事件行为,必须添加一个 cut 事件处理程序,并且该处理程序必须调用 preventDefault() 来取消该事件。

取消该事件是必要的,以便使用 clipboardData 中的数据更新 系统剪贴板。如果 ClipboardEvent 未被取消,则会改用当前文档选区中的数据进行复制。

请注意,取消 cut 事件也会阻止文档被更新(即当前选区不会被移除)。事件处理程序需要手动更新文档以移除当前选中的文本。

// Overwrite what is copied to the clipboard.
document.addEventListener('cut', function(e) {
  // e.clipboardData is initially empty, but we can set it to the
  // data that we want copied onto the clipboard as part of the cut.
  // Write the data that we want copied onto the clipboard.
  e.clipboardData.setData('text/plain', 'Hello, world!');
  e.clipboardData.setData('text/html', '<b>Hello, world!</b>');

  // Since we will be canceling the cut operation, we need to manually
  // update the document to remove the currently selected text.
  deleteCurrentDocumentSelection();

  // This is necessary to prevent the document selection from being
  // written to the clipboard.
  e.preventDefault();
});

6.3. 覆盖 paste 事件

要覆盖默认的 paste 事件行为,必须添加一个 paste 事件处理程序,并且该处理程序必须调用 preventDefault() 来取消该事件。

取消该事件是必要的,以便用户代理不会使用 系统剪贴板中的数据更新文档。

请注意,取消 paste 事件也会阻止文档被更新(即文档中什么都不会被粘贴)。事件处理程序需要手动将数据粘贴到文档中。

另请注意,在粘贴时,拖拽数据存储模式标志为只读,因此从 paste 事件处理程序调用 setData() 不会修改插入的数据,也不会修改剪贴板上的数据。

// Overwrite what is being pasted onto the clipboard.
document.addEventListener('paste', function(e) {
  // e.clipboardData contains the data that is about to be pasted.
  if (e.clipboardData.types.indexOf('text/html') > -1) {
    var oldData = e.clipboardData.getData('text/html');
    var newData = '<b>Ha Ha!</b> ' + oldData;

    // Since we are canceling the paste operation, we need to manually
    // paste the data into the document.
    pasteClipboardData(newData);

    // This is necessary to prevent the default paste action.
    e.preventDefault();
  }
});

6.4. 强制数据类型

实现必须识别以下数据类型的原生 OS 剪贴板格式描述,以便能够为粘贴事件填充 DataTransferItemListClipboardItem,并响应复制和剪切事件在 OS 剪贴板上设置正确的数据格式。

6.4.1. Reading from the clipboard

如果剪贴板上存在相应的原生类型,这些数据类型必须由 paste 事件公开。

6.4.2. Writing to the clipboard

如果这些数据类型在 copycut 事件期间添加到 DataTransfer 对象中,则必须将它们连同相应的原生类型描述一起放置在剪贴板上。

警告!作为安全防范措施,不受信任的脚本被允许写入剪贴板的数据类型受到限制。不受信任的脚本可能试图通过将已知会触发漏洞的数据放置在剪贴板上来利用本地软件中的安全漏洞。

6.5. 可选数据类型

实现 MAY 识别以下数据类型的原生 OS 剪贴板格式描述,以便能够为粘贴事件用正确的描述填充 ClipboardItem,并响应复制和剪切事件在 OS 剪贴板上设置正确的数据格式。

如果剪贴板上存在相应的原生类型,用户代理 MAY 公开这些数据类型。

6.6. 未经净化的数据类型

本节是非规范性的。

这些数据类型 MUST NOT 被用户代理净化。

这些数据类型 MAY NOT 被用户代理净化。

可选的未经净化的数据类型 是由 Web 作者指定的 MIME 类型,它们 MAY NOT 被用户代理净化。有效的 可选的未经净化的数据类型 列在下方。

可选的未经净化的数据类型可能由于用户代理的隐私要求而不受支持。

7. 异步剪贴板 API

partial interface Navigator {
  [SecureContext, SameObject] readonly attribute Clipboard clipboard;
};

一致性

文档约定

一致性要求通过描述性断言和 RFC 2119 术语相结合来表达。本文档规范性部分中的关键词“MUST”(必须)、“MUST NOT”(不得)、“REQUIRED”(必需)、“SHALL”(应)、“SHALL NOT”(不应)、“SHOULD”(推荐)、“SHOULD NOT”(不推荐)、“RECOMMENDED”(建议)、“MAY”(可以)和“OPTIONAL”(可选)应按照 RFC 2119 中的描述进行解释。然而,为了可读性,这些词在本文档中不以全大写形式出现。

本规范的所有文本均为规范性文本,明确标记为非规范性的部分、示例和注释除外。 [RFC2119]

本规范中的示例均以“例如”一词引入,或者通过 class="example" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以“Note”一词开头,并使用 class="note" 与规范性文本隔开,如下所示

注意,这是一个说明性注释。

一致性算法

作为算法一部分的祈使语气要求(例如“去除任何前导空格字符”或“返回 false 并中止这些步骤”)应根据引入算法时使用的关键词(“必须”、“应该”、“可以”等)进行解释。

以算法或具体步骤表述的一致性要求可以用任何方式实现,只要最终结果等效即可。特别地,本规范定义的算法旨在易于理解,而不旨在提高性能。鼓励实现者进行优化。

索引

本规范定义的术语

  • constructor(type, eventInitDict)
  • copy(复制),在 § 5.2.2
  • 创建一个 ClipboardItem 对象,在 § 7.2
  • cut(剪切),在 § 5.2.3
  • data
  • 可编辑上下文,在 § 3
  • 触发 clipboardchange 事件,在 § 5.2.1.1
  • 触发剪贴板事件,在 未编号章节
  • 生成 changeId,在 § 5.2.1.4
  • getType(type),在 § 7.2.2
  • "inline"(内联),在 § 7.2
  • isCustom(是否自定义),在 § 7.2
  • 表示列表,在 § 7.2
  • 强制数据类型,在 § 6.4
  • mime 类型,在 § 7.2
  • 名称,在 § 4
  • 可选数据类型,在 § 6.5
  • 可选非净化数据类型,在 § 6.6
  • 操作系统特定的自定义映射名称,在 未编号章节
  • 操作系统特定的自定义名称,在 未编号章节
  • 操作系统特定的通用格式,在 未编号章节
  • paste(粘贴),在 § 5.2.4
  • 呈现样式,在 § 7.2
  • PresentationStyle(呈现样式枚举),在 § 7.2
  • presentationStyle
  • 处理 HTML 粘贴事件,在 未编号章节
  • read(),在 § 7.3
  • read(formats),在 § 7.3
  • readText(),在 § 7.3
  • 读取网络自定义格式,在 未编号章节
  • 表示 (representation),在 § 7.2
  • 脚本可以访问剪贴板,在 § 8
  • 脚本触发,在 § 8
  • supports(type),在 § 7.2.3
  • 系统剪贴板,在 § 4
  • 系统剪贴板数据,在 § 4
  • 系统剪贴板项目,在 § 4
  • 系统剪贴板表示,在 § 4
  • types
  • ClipboardChangeEvent 的属性,在 § 5.2.1
  • ClipboardItem 的属性,在 § 7.2.1
  • ClipboardChangeEvent 的定义 (dfn),在 § 5.2.1
  • ClipboardChangeEventInit 的定义 (dfn),在 § 5.2.1
  • ClipboardChangeEventInit 的字典成员,在 § 5.2.1
  • 类型数组,在 § 7.2
  • 非净化 (unsanitized),在 § 7.3
  • 非净化数据类型,在 § 6.6
  • "unspecified"(未指定),在 § 7.2
  • 网络自定义格式,在 § 7.2
  • 从操作系统特定格式获取通用 MIME 类型,在 未编号章节
  • 将 Blob 和选项写入剪贴板,在 未编号章节
  • 将内容写入剪贴板,在 未编号章节
  • write(data),在 § 7.3
  • writeText(data),在 § 7.3
  • 写入网络自定义格式,在 未编号章节
  • 通过引用定义的术语

    • [] 定义了以下术语
      • 允许显示弹出窗口
      • 概念 dnd p
      • 概念 dnd ro
      • 概念 dnd rw
      • 构建事件
      • 拖拽数据项类型
      • 拖拽数据项类型字符串
      • 拖拽数据存储模式
      • 可聚焦区域
      • 权限任务源
      • storage key (存储键)
    • [DOM] 定义了以下术语
      • 文档 (Document)
      • Event
      • EventInit
      • EventTarget
      • composed
      • fire an event
      • isTrusted
      • preventDefault()
    • [ENCODING] 定义了以下术语
      • UTF-8 解码
      • UTF-8 编码
    • [FileAPI] 定义了以下术语
      • Blob
      • File
      • lastModified
      • name
      • type
    • [HTML] 定义了以下术语
      • DataTransfer
      • DataTransferItem
      • DataTransferItemList
      • Navigator
      • clear()
      • clearData(format)
      • 编辑宿主
      • 文件
      • getData(format)
      • 全局对象 (global object)
      • 获取焦点步骤
      • 并行执行 (in parallel)
      • items(项目)
      • queue a global task (排队全局任务)
      • relevant global object
      • relevant realm (相关领域)
      • 相关设置对象 (relevant settings object)
      • setData(format, data)
      • sticky activation
      • 系统焦点
      • the body element
      • transient activation (瞬态激活)
      • types
    • [INFRA] 定义了以下术语
      • clone
      • contain
      • size
      • 以...开头
    • [MIMESNIFF] 定义了以下术语
      • 本质
      • MIME 类型
      • 解析 MIME 类型
      • 序列化 MIME 类型
    • [PERMISSIONS] 定义了以下术语
      • PermissionDescriptor (权限描述符)
      • denied (拒绝)
      • 已授予
      • 权限描述符类型
      • permission state (权限状态)
      • powerful feature (强大功能)
      • request permission to use (请求使用权限)
    • [WEBIDL] 定义了以下术语
      • DOMException
      • DOMString
      • Exposed
      • FrozenArray
      • NotAllowedError
      • NotFoundError
      • Promise
      • SameObject
      • SecureContext
      • TypeError
      • a new promise (一个新的 promise)
      • bigint
      • boolean
      • 创建冻结数组
      • new
      • react
      • record
      • reject (拒绝)
      • sequence
      • this
      • undefined

    引用

    规范性引用

    [DOM]
    Anne van Kesteren. DOM 标准. Living Standard. URL: https://dom.spec.whatwg.org/
    [ENCODING]
    Anne van Kesteren. 编码标准. Living Standard. URL: https://encoding.spec.whatwg.org/
    [FileAPI]
    Marijn Kruisselbrink. 文件 API. 2024 年 12 月 4 日. WD. URL: https://w3org.cn/TR/FileAPI/
    [HTML]
    Anne van Kesteren; et al. HTML 标准. Living Standard. URL: https://html.whatwg.cn/multipage/
    [INFRA]
    Anne van Kesteren; Domenic Denicola. Infra 标准. Living Standard. URL: https://infra.spec.whatwg.org/
    [MIMESNIFF]
    Gordon P. Hemsley. MIME 嗅探标准. 活标准. URL: https://mimesniff.spec.whatwg.org/
    [PERMISSIONS]
    Marcos Caceres; Mike Taylor. Permissions (权限). 2025年10月6日. WD. URL: https://w3org.cn/TR/permissions/
    [RFC2119]
    S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
    [RFC2392]
    E. Levinson. Content-ID 和 Message-ID 统一资源定位符. 1998 年 8 月. 建议标准. URL: https://www.rfc-editor.org/rfc/rfc2392
    [WEBIDL]
    Edgar Chen; Timothy Gu. Web IDL 标准. Living Standard. URL: https://webidl.spec.whatwg.org/

    参考资料

    [HTML5]
    Ian Hickson; et al. HTML5。2018 年 3 月 27 日。REC。URL: https://w3org.cn/TR/html5/
    [MICROSOFT-CLIP-OP]
    关于 DHTML 数据传输。Microsoft 开发人员网络。. URL: https://msdn.microsoft.com/en-us/ie/ms537658(v=vs.94)
    [SVG11]
    Erik Dahlström; et al. 可缩放矢量图形 (SVG) 1.1 (第二版). 2011 年 8 月 16 日. REC. URL: https://w3org.cn/TR/SVG11/

    IDL 索引

    dictionary ClipboardEventInit : EventInit {
      DataTransfer? clipboardData = null;
    };
    
    [Exposed=Window]
    interface ClipboardEvent : Event {
      constructor(DOMString type, optional ClipboardEventInit eventInitDict = {});
      readonly attribute DataTransfer? clipboardData;
    };
    
    dictionary ClipboardChangeEventInit : EventInit {
      sequence<DOMString> types = [];
      bigint changeId = 0;
    };
    
    [Exposed=Window]
    interface ClipboardChangeEvent : Event {
      constructor(DOMString type, optional ClipboardChangeEventInit eventInitDict = {});
      readonly attribute FrozenArray<DOMString> types;
      readonly attribute bigint changeId;
    };
    
    partial interface Navigator {
      [SecureContext, SameObject] readonly attribute Clipboard clipboard;
    };
    
    typedef Promise<(DOMString or Blob)> ClipboardItemData;
    
    [SecureContext, Exposed=Window]
    interface ClipboardItem {
      constructor(record<DOMString, ClipboardItemData> items,
                  optional ClipboardItemOptions options = {});
    
      readonly attribute PresentationStyle presentationStyle;
      readonly attribute FrozenArray<DOMString> types;
    
      Promise<Blob> getType(DOMString type);
    
      static boolean supports(DOMString type);
    };
    
    enum PresentationStyle { "unspecified", "inline", "attachment" };
    
    dictionary ClipboardItemOptions {
      PresentationStyle presentationStyle = "unspecified";
    };
    
    typedef sequence<ClipboardItem> ClipboardItems;
    
    [SecureContext, Exposed=Window]
    interface Clipboard : EventTarget {
      Promise<ClipboardItems> read(optional ClipboardUnsanitizedFormats formats = {});
      Promise<DOMString> readText();
      Promise<undefined> write(ClipboardItems data);
      Promise<undefined> writeText(DOMString data);
    };
    
    dictionary ClipboardUnsanitizedFormats {
      sequence<DOMString> unsanitized;
    };
    
    dictionary ClipboardPermissionDescriptor : PermissionDescriptor {
      boolean allowWithoutGesture = false;
    };
    
    

    问题索引

    Web 开发人员可能对底层拒绝原因感兴趣。
    在作者调用 getType 后,异步从系统剪贴板读取数据应该是可能的,但是这一系列步骤暗示数据将在读取时提供。
    一些操作系统包含多个剪贴板(例如 Linux,“主”、“辅助”、“选择”)。定义应从中读取数据的剪贴板。
    添加净化复制的定义。
    clipboard-write 已在 https://github.com/w3c/clipboard-apis/pull/164 中移除。
    data 包含多个项目且操作系统支持多个本机剪贴板项目时,当前算法会将项目按顺序写入系统剪贴板,而不是集体写入。
    添加净化复制的定义。
    clipboard-write 已在 https://github.com/w3c/clipboard-apis/pull/164 中移除。
    将事情留给实现是不好的。这里应该发生什么?
    “从剪贴板删除特定类型”功能处于风险之中。它似乎没那么重要,而且不清楚它是否能在相关平台上轻松实现。
    一些操作系统包含多个剪贴板(例如 Linux,“主”、“辅助”、“选择”)。定义数据应写入其中的哪一个。
    更详细地指定读取 webCustomFormatMap 的过程。
    为什么在这里?为什么不在 HTML 规范中?
    这些步骤是必要的吗?我们是否了解支持多个具有内部引用的部分的本机(平台)剪贴板实现?
    此功能处于风险之中,因为尚不清楚是否需要它,而且难以以跨平台的方式进行测试。
    MDN

    Clipboard/read(读取)

    Firefox🔰 90+Safari13.1+Chrome?
    Opera63+Edge?
    Edge (旧版)IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet12.0+Opera Mobile54+
    MDN

    Clipboard/readText(读取文本)

    FirefoxSafari13.1+Chrome66+
    Opera?Edge79+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    Clipboard/write(写入)

    在所有当前引擎中。

    Firefox87+Safari13.1+Chrome66+
    Opera63+Edge79+
    Edge (旧版)IE
    Firefox for Android?iOS Safari?Chrome for Android66+Android WebView?Samsung Internet12.0+Opera Mobile54+
    MDN

    Clipboard/writeText(写入文本)

    在所有当前引擎中。

    Firefox63+Safari13.1+Chrome66+
    Opera?Edge79+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    剪贴板

    在所有当前引擎中。

    Firefox63+Safari13.1+Chrome66+
    Opera?Edge79+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    ClipboardEvent/ClipboardEvent

    在所有当前引擎中。

    Firefox22+Safari10.1+Chrome58+
    Opera?Edge79+
    Edge (Legacy)17+IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    ClipboardEvent/clipboardData

    在所有当前引擎中。

    Firefox22+Safari10.1+Chrome41+
    Opera?Edge79+
    Edge (Legacy)12+IE5+
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    ClipboardEvent

    在所有当前引擎中。

    Firefox22+Safari10.1+Chrome41+
    Opera?Edge79+
    Edge (Legacy)12+IE4+
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    ClipboardItem/ClipboardItem

    在所有当前引擎中。

    Firefox🔰 87+Safari13.1+Chrome98+
    Opera?Edge98+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android98+Android WebView?Samsung Internet?Opera Mobile?
    MDN

    ClipboardItem/getType(获取类型)

    在所有当前引擎中。

    Firefox🔰 87+Safari13.1+Chrome76+
    Opera?Edge79+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android84+Android WebView?Samsung Internet?Opera Mobile?
    MDN

    ClipboardItem/presentationStyle(呈现样式)

    Firefox🔰 87+Safari13.1+Chrome
    Opera?Edge
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    ClipboardItem/types(类型)

    在所有当前引擎中。

    Firefox🔰 87+Safari13.1+Chrome76+
    Opera?Edge79+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android84+Android WebView?Samsung Internet?Opera Mobile?
    MDN

    ClipboardItem

    在所有当前引擎中。

    Firefox🔰 87+Safari13.1+Chrome76+
    Opera?Edge79+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android84+Android WebView?Samsung Internet?Opera Mobile?
    MDN

    Element/copy_event(复制事件)

    在所有当前引擎中。

    Firefox22+Safari3+Chrome1+
    Opera12.1+Edge79+
    Edge (旧版)12+IE9+
    Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
    MDN

    Element/cut_event(剪切事件)

    在所有当前引擎中。

    Firefox22+Safari3+Chrome1+
    Opera12.1+Edge79+
    Edge (旧版)12+IE9+
    Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
    MDN

    Element/paste_event(粘贴事件)

    在所有当前引擎中。

    Firefox22+Safari3+Chrome1+
    Opera12.1+Edge79+
    Edge (旧版)12+IE9+
    Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
    MDN

    Navigator/clipboard(剪贴板)

    在所有当前引擎中。

    Firefox63+Safari13.1+Chrome66+
    Opera?Edge79+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?