js调用剪贴板API教程

266 阅读4分钟

前记

记在前面:这是一篇关于javascript调用系统剪贴板的教程。(由于在长时间回来查看此文档居然没有理解,于是重新更新 时间:2025/10/20 20:32)

前情提要

目前原生js操控系统剪贴板有三个办法:

  • Document.execCommand()方法
  • 异步的 Clipboard API
  • copy事件和paste事件
    这三种方法现代浏览器基本都支持,但请注意因为剪贴板属于系统安全隐私,所以在使用这些函数的时候有些浏览器会抛出隐私请求。

浏览器剪贴板权限获取.png

如果用户阻止那么请求剪贴板的操作就会失效。

一、Document.execCommand()方法

使用前请注意该方法已被弃用,如遇无法使用请看点击跳转底部表格中若无则该浏览器已不支持。

使用准备

准备一段需要被复制的文字,尽可能存在于页面中,否则可能会报错。

复制文本到剪切板

首先选中文本( 调用元素的select()方法 )

const inputElement = document.querySelector('#input');
inputElement.select();

然后调用此函数就完成了复制操作

document.execCommand('copy');

粘贴文本到文本框

首先需要聚焦一个元素,最好使用文本框元素。
粘贴时会将剪贴板中的内容粘贴到选中的元素当中。
使用以下代码聚焦文本框

const pasteText = document.querySelector('#output');
pasteText.focus();

粘贴内容到元素

document.execCommand('paste');

二、异步的Clipboard API

Clipboard API是现代剪贴板操作手段,它的操作逻辑超过其他方法,比其他方法更合理,更强大。 它的所有操作都是异步的,返回 Promise 对象,不会造成页面卡顿。而且,它可以将任意内容(比如图片)放入剪贴板。但Chrome 浏览器规定,只有 HTTPS 协议的页面才能使用这个 API。另外若直接在开发者终端中调用会无效。

navigator.clipboard将返回 Clipboard 对象,所有操作都通过这个对象进行(如果navigator.clipboard属性返回undefined,则该浏览器不支持此API)。

const clipboardObj = navigator.clipboard;

复制文本到剪切板

复制数据可以直接使用(参数是要复制的文字)

await navigator.clipboard.writeText('Yo')

复制图片等需要指定类型的数据可以使用 Clipboard.write() 该方法接受一个 ClipboardItem 实例作为参数,表示写入剪贴板的数据(截至2024年9月Chrome 浏览器只支持PNG图片)。

粘贴文本到变量

使用以下方法会使一个变量获取剪贴板内容

const text = await navigator.clipboard.readText();

同样的复制图片等类型可以使用Clipboard.read()该方法返回一个 Promise 对象。一旦该对象的状态变为 resolved,就可以获得一个数组,每个数组成员都是 ClipboardItem 对象的实例。

const clipboardItems = await navigator.clipboard.read();
    for (const clipboardItem of clipboardItems) {
      for (const type of clipboardItem.types) {
        const blob = await clipboardItem.getType(type)

ClipboardItem 对象表示一个单独的剪贴项,每个剪贴项都拥有ClipboardItem.types属性和ClipboardItem.getType()方法。

ClipboardItem.types属性返回一个数组,里面的成员是该剪贴项可用的 MIME 类型,比如某个剪贴项可以用 HTML 格式粘贴,也可以用纯文本格式粘贴,那么它就有两个 MIME 类型(text/htmltext/plain)。

ClipboardItem.getType(type)方法用于读取剪贴项的数据,返回一个 Promise 对象。该方法接受剪贴项的 MIME 类型作为参数,返回该类型的数据,该参数是必需的,否则会报错。

利用copypaste事件

使用准备

需要为元素添加copy或者paste事件监听

elent.addEventListener('copy', (event) => {
//your code in there
});

复制文本到剪切板

copy事件中加入

  • Event.clipboardData.getData(type):获取剪贴板数据,需要指定数据类型。
  • Event.clipboardData.clearData([type]):清除剪贴板数据,可以指定数据类型。如果不指定类型,将清除所有类型的数据。
  • Event.clipboardData.items:一个类似数组的对象,包含了所有剪贴项,不过通常只有一个剪贴项。
  • Event.preventDefault():用于取消默认剪贴板的粘贴和复制操作

粘贴文本到文本框

使用

  • Event.clipboardData.setData(type, data):修改剪贴板数据,需要指定数据类型(TEXT)。

总结

使用这些操作需要优秀的js编程经验,你可以使用这种策略进行标签页通信,也可以进行远程认证。

启发自

阮一峰的网络日志
MDN web doc