document.execCommand
API
-
复制操作
复制时,先选中文本,然后调用
document.execCommand('copy')
:const inputElement = document.querySelector("#input"); inputElement.select(); document.execCommand("copy");
注意:复制操作最好由用户触发,如果脚本自主执行,可能某些浏览器会报错
-
剪贴操作:
同复制操作
const inputElement = document.querySelector("#input"); inputElement.select(); document.execCommand("cut");
-
粘贴操作
粘贴时,调用document.execCommand('paste')
,会将剪贴板里面的内容输出到当前聚焦元素中const pasteText = document.querySelector("#output"); pasteText.focus(); document.execCommand("paste");
缺点:
- 只能将选中的内容复制到剪贴板,无法写入任意内容
- 同步操作遇到大量数据,容易卡顿,有些浏览器还会跳出提示框,要求用户许可,
在用户选择前页面会失去响应
Clipboard API
-
申请权限
浏览器规定,只有 HTTPS 协议的页面和开发环境(
localhost
)才能使用 clipboard API。
其次,在调用时需要明确获得用户许可,权限使用 Permission API 获取:const queryOpts = { // 'clipboard-read' 为读取剪贴板权限, 'clipboard-write' 为写权限 name: "clipboard-read", // 控制调用 clipboard API 时是否需要用户触发,默认值因浏览器而异,不要省略该参数 allowWithoutGesture: false, }; const permissionStatus = await navigator.permissions.query(queryOps); // permissionStatus 可能返回这三个值: // 1. 'granted': 表示用户允许 // 2. 'denied': 表示用户拒绝 // 3. 'prompt': 表示用户未明确允许,与拒绝相同
-
从剪贴板读取数据
// 读取文本 const text = await navigator.clipboard.readText(); // 读取任意数据 const clipboardItems = await navigator.clipboard.read(); clipboardItems.forEach(clipboardItem => { // 通过 mime type 获取 Blob 对象 const blob = await clipboardItem.getType('text/plain'); })
-
将数据写入剪贴板
// 写纯文本数据 await navigator.clipboard.writeText("text"); // 同时写入多个数据 const canvas = document.getElementById("canvas"); const blob = await canvas.toBlob(); const text = new Blob(["text"], { type: "text/plain" }); const item = new ClipboardItem({ [blob.type]: blob, [text.type]: text, }); await navigator.clipboard.write([item]);
注意:
- 只有 HTTPS 协议的页面和开发环境可以使用
- 需要 permission API 获得用户许可
- 页面窗口失去焦点时调用 clipboard API 会报错
分类:
前端技巧
标签:
JavaScript
, 前端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?