ClipboardItem

Baseline 2024 *
新推出

自 2024 年 6 月起,此功能已在最新的设备和浏览器版本中可用。此功能可能不适用于较旧的设备或浏览器。

* 此特性的某些部分可能存在不同级别的支持。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

ClipboardItem 接口是 Clipboard API 的一部分,用于表示单个数据项格式。在使用 Clipboard.read()Clipboard.write() 读取或写入剪贴板数据时会用到它。

ClipboardItem 接口允许开发者使用单一类型来表示一系列不同的数据格式。

注意: read()write() 方法可用于处理文本字符串和由 Blob 实例表示的任意数据项。但是,如果您仅处理文本,则使用 Clipboard.readText()Clipboard.writeText() 方法会更方便。

构造函数

ClipboardItem()

创建一个新的 ClipboardItem 对象,其中键为 MIME 类型,值为数据。

实例属性

types 只读

返回一个包含 ClipboardItem 中可用 MIME 类型的 Array

presentationStyle 只读

返回以下值之一:"unspecified""inline""attachment"

静态方法

ClipboardItem.supports()

检查剪贴板是否支持给定的 MIME 类型。这使得网站在尝试写入数据之前可以检测 MIME 类型是否受支持。

实例方法

getType()

返回一个 Promise,该 Promise 会解析为所请求 MIME 类型Blob,或者在找不到 MIME 类型时返回一个错误。

示例

将文本写入剪贴板

在此示例中,我们首先定义两个常量,分别引用包含一些文本的 <p> 元素和一个 <button> 元素。

接下来,我们定义一个名为 copyToClipboard() 的函数。该函数首先将 "text/plain" MIME 类型存储在一个常量中,然后创建一个名为 clipboardItemData 的对象,该对象包含一个属性,其键是 MIME 类型,值是我们想要复制到剪贴板的文本(在本例中是 <p> 元素的内容)。由于我们处理的是文本,可以直接传递它,而无需创建 Blob

我们使用 ClipboardItem() 构造函数构建一个新的 ClipboardItem 对象,并将其传递给 Clipboard.write() 方法以将文本复制到剪贴板。

最后,我们将一个事件监听器添加到 <button> 上,以便在按下按钮时运行该函数。

js
const textSource = document.querySelector("p");
const copyBtn = document.querySelector("button");

async function copyToClipboard() {
  const type = "text/plain";
  const clipboardItemData = {
    [type]: textSource.textContent,
  };
  const clipboardItem = new ClipboardItem(clipboardItemData);
  await navigator.clipboard.write([clipboardItem]);
}

copyBtn.addEventListener("click", copyToClipboard);

将图像写入剪贴板

在此,我们使用 supports() 来检查 image/svg+xml MIME 数据类型是否受支持。如果受支持,我们将使用 Fetch API 获取一个 SVG 图像,然后将其读取为一个 Blob,我们可以使用该 Blob 创建一个 ClipboardItem 并将其写入剪贴板。

js
async function writeClipImg() {
  try {
    if (ClipboardItem.supports("image/svg+xml")) {
      const imgURL = "/my-image.svg";
      const data = await fetch(imgURL);
      const blob = await data.blob();
      await navigator.clipboard.write([
        new ClipboardItem({
          [blob.type]: blob,
        }),
      ]);
      console.log("Fetched image copied.");
    } else {
      console.log("SVG images are not supported by the clipboard.");
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}

从剪贴板读取

在此,我们通过 clipboard.read() 方法返回剪贴板上的所有项。然后利用 ClipboardItem.types 属性来设置 getType() 的参数并返回相应的 blob 对象。

js
async function getClipboardContents() {
  try {
    const clipboardItems = await navigator.clipboard.read();

    for (const clipboardItem of clipboardItems) {
      for (const type of clipboardItem.types) {
        const blob = await clipboardItem.getType(type);
        // we can now use blob here
      }
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}

规范

规范
Clipboard API 和事件
# clipboarditem

浏览器兼容性

另见