跳转到主内容
极星编程网:以代码为星,赴技术山海!

javascript如何实现复制到剪贴板_有哪些现代API【教程】

最可靠方式是 navigator.clipboard.writeText(),但需满足安全上下文(HTTPS/localhost)和用户手势触发;否则报错如“undefined”“Permission denied”或“Document not focused”。 现代 浏览器 中,JavaScript 实现复制到剪贴板最可靠的方式是使用
navigator.clipboard.writeText()
,它取代了已废弃的
document.execCommand('copy')
。但直接调用该 API 有明确的限制条件,不是任何时候都能成功。 为什么
navigator.clipboard.writeText()
会报错? 这个 API 只能在安全上下文(HTTPS 或 localhost)中调用,且必须由用户手势(如
click
、
keydown
)触发 —— 不能在定时器、异步回调或页面加载完成时自动执行。 常见错误信息:
"navigator.clipboard is undefined"
(旧版 Safari 或禁用权限时)
"Permission denied"
(未获用户授权,或非用户触发)
"Failed to execute 'writeText' on 'Clipboard': Document is not focused"
(页面失焦,尤其在 Electron 或某些 iframe 场景) 如何安全调用
navigator.clipboard.writeText()
? 必须确保:① 在事件 处理器 内;② 检查 API 是否可用;③ 捕获并处理拒绝情况。
button.addEventListener('click', async () => { if (!navigator.clipboard) { console.error('Clipboard API not supported'); return; } try { await navigator.clipboard.writeText('Hello, world!'); console.log('Copied!'); } catch (err) { console.error('Failed to copy: ', err); } });
不要省略
async/await
或
.catch()
,否则静默失败 避免在
setTimeout
或
Promise.resolve().then()
中调用 —— 即使紧接在 click 后也会失去“用户手势”上下文 Safari 16.4+ 才支持
writeText()
,更早版本需降级方案 需要兼容老浏览器怎么办? 当
navigator.clipboard
不可用时,可回退到临时