剪贴板:write() 方法

基线 2024

新可用

2024 年 6 月起,此功能可在最新的设备和浏览器版本中使用。此功能可能在较旧的设备或浏览器中无法使用。

安全上下文:此功能仅在安全上下文(HTTPS)中可用,且仅在部分或全部支持的浏览器中可用。

write() 方法是 Clipboard 接口的方法,用于将任意数据(如图像)写入剪贴板,并在完成后履行返回的 Promise。这可用于实现剪切和复制功能。

理论上,该方法可以写入任意数据(与 writeText() 不同,后者只能写入文本)。浏览器通常支持写入文本、HTML 和 PNG 图像数据 - 有关更多信息,请参阅浏览器兼容性

语法

js
write(data)

参数

data

包含要写入剪贴板的数据的 ClipboardItem 对象数组。

返回值

一个 Promise,在数据写入剪贴板后解析。请注意,如果底层操作系统不支持在系统剪贴板上使用多个本机剪贴板项,则仅写入数组中的第一个 ClipboardItem

如果剪贴板无法写入剪贴板,则 promise 将被拒绝。

异常

NotAllowedError DOMException

如果不允许写入剪贴板,则抛出此异常。

安全注意事项

只能在安全上下文中写入剪贴板。

其他安全要求在 API 概述主题的安全注意事项部分中介绍。

示例

将文本写入剪贴板

此示例函数在按下按钮时用指定的字符串替换剪贴板的当前内容。请注意,对于这种情况,您可以轻松地使用 Clipboard.writeText()

js
button.addEventListener("click", () => setClipboard("<empty clipboard>"));

async function setClipboard(text) {
  const type = "text/plain";
  const blob = new Blob([text], { type });
  const data = [new ClipboardItem({ [type]: blob })];
  await navigator.clipboard.write(data);
}

setClipboard() 方法首先创建一个新的 Blob 对象。此对象是构建发送到剪贴板的 ClipboardItem 对象所必需的。Blob 构造函数接收我们想要复制的内容及其类型。此 Blob 对象可以来自许多来源;例如,画布

接下来,我们创建一个新的 ClipboardItem 对象,将 blob 放入其中以发送到剪贴板。传递给 ClipboardItem 构造函数的对象的键指示内容类型,值指示内容。然后使用 await 调用 write()。可以使用 try..catch 块捕获写入数据的任何错误。

将画布内容写入剪贴板

此示例在画布上绘制一个蓝色矩形。您可以单击矩形以将画布内容作为图像复制到剪贴板,然后选择另一个元素并将剪贴板中的内容粘贴到其中。

HTML

HTML 仅定义了我们的 <canvas> 元素和 id 为 target<div> 元素,画布图像将粘贴到其中。

html
<canvas id="canvas" width="100" height="100"></canvas>

<div id="target">Paste here.</div>
js
const logElement = document.querySelector("#log");
function log(text) {
  logElement.innerText = `${logElement.innerText}${text}\n`;
  logElement.scrollTop = logElement.scrollHeight;
}

JavaScript

首先,我们定义一个 async 函数以将画布复制到 blob 中。这将旧的回调样式 HTMLCanvasElement.toBlob() 方法包装到更直观的基于 Promise 的函数中。

js
// Async/await method replacing toBlob() callback
async function getBlobFromCanvas(canvas) {
  return new Promise((resolve, reject) => {
    canvas.toBlob((blob) => {
      if (blob) {
        resolve(blob);
      } else {
        reject(new Error("Canvas toBlob failed"));
      }
    });
  });
}

接下来,我们设置画布并为 click 事件添加事件侦听器。

当您单击蓝色矩形时,代码首先检查剪贴板是否支持类型为 "image/png" 的数据。如果是,则将显示矩形的画布复制到 blob 中,然后将 blob 添加到 ClipboardItem,然后写入剪贴板。

js
const canvas = document.getElementById("canvas");

// Set up canvas
const ctx = canvas.getContext("2d");
ctx.fillStyle = "cornflowerblue";
ctx.fillRect(0, 0, 100, 100);

canvas.addEventListener("click", copyCanvasContentsToClipboard);
const target = document.getElementById("target");

async function copyCanvasContentsToClipboard() {
  if (ClipboardItem.supports("image/png")) {
    // Copy canvas to blob
    try {
      const blob = await getBlobFromCanvas(canvas);
      // Create ClipboardItem with blob and it's type, and add to an array
      const data = [new ClipboardItem({ [blob.type]: blob })];
      // Write the data to the clipboard
      await navigator.clipboard.write(data);
      log("Copied");
    } catch (error) {
      log(error);
    }
  } else {
    log("image/png is not supported");
  }
}

请注意,对 PNG 文件的剪贴板支持是规范的强制部分,因此我们实际上不需要使用 ClipboardItem.supports() 在上面进行检查(它始终返回 true)。在我们要获取可选文件类型或我们事先不知道类型的资源的情况下,该检查将更有用。

然后,我们为我们要在其中显示剪贴板内容作为图像的元素上的 paste 事件 定义一个事件侦听器。FileReader API 允许我们使用 readAsDataUrl 方法读取 blob,并使用画布内容创建 <img> 元素。

js
target.addEventListener("paste", (event) => {
  const items = (event.clipboardData || window.clipboardData).items;
  const blob = items[0].getAsFile();
  const reader = new FileReader();

  reader.addEventListener("load", (event) => {
    const img = new Image();
    img.src = event.target.result;
    target.appendChild(img);
  });

  reader.readAsDataURL(blob);
});

结果

结果如下所示。首先单击蓝色正方形,然后选择文本“在此粘贴”,并使用您的操作系统特定的键盘组合从剪贴板粘贴(例如,Windows 上的 Ctrl+V)。

规范

规范
剪贴板 API 和事件
# dom-clipboard-write

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅