最推荐使用 navigator.clipboard.writeText(),需在安全上下文和用户触发事件中调用,返回 Promise 并需处理权限异常;旧浏览器可 fallback 至 document.execCommand('copy') 配合临时 textarea。

JavaScript 中复制文本到剪贴板最推荐的方式是使用 navigator.clipboard.writeText(),它现代、安全、无需手动创建临时元素,且支持跨浏览器(Chrome 66+、Firefox 63+、Safari 13.1+、Edge 79+)。
使用 navigator.clipboard.writeText()(推荐)
这是当前标准做法,需在安全上下文(HTTPS 或 localhost)中运行,且最好在用户触发的事件(如点击)中调用,否则部分浏览器会拒绝执行。
- 直接传入字符串即可,返回 Promise,可 await 或 .then() 处理成功/失败
- 需处理权限异常(如用户拒绝剪贴板访问)和写入失败情况
- 示例:
document.getElementById('copyBtn').addEventListener('click', async () => {
try {
await navigator.clipboard.writeText('Hello, world!');
console.log('复制成功');
} catch (err) {
console.error('复制失败:', err);
}
});
兼容旧浏览器的 fallback 方案(document.execCommand)
对于不支持 navigator.clipboard 的老版本浏览器(如 IE 或早期移动端),可用已废弃但仍广泛支持的 document.execCommand('copy'),需配合临时 <textarea></textarea> 元素操作。
- 创建并隐藏 textarea,设置 value,选中内容,执行 copy
- 操作完成后立即移除 textarea,避免页面干扰
- 注意:该方法在现代浏览器中已被标记为 deprecated,仅作兼容用
注意事项与常见问题
复制功能受浏览器策略限制,实际使用中需留意:
立即学习“Java免费学习笔记(深入)”;
- 必须由用户手势触发:不能在页面加载或定时器中自动调用,否则会被静默拒绝
-
HTTPS 环境要求:非安全上下文(HTTP 非 localhost)下
navigator.clipboard不可用 -
移动端兼容性:iOS Safari 对
writeText支持良好(13.4+),但部分安卓 WebView 可能需降级方案 - 权限提示:首次调用时,Chrome 等浏览器可能弹出权限请求,用户拒绝后需引导重新触发
封装一个简洁可靠的复制函数
可将逻辑封装为带 fallback 的工具函数,兼顾现代 API 与兼容性:
async function copyToClipboard(text) {
if (navigator.clipboard && window.isSecureContext) {
try {
await navigator.clipboard.writeText(text);
return true;
} catch (e) {
// 权限被拒或写入失败,尝试 fallback
}
}
// fallback:execCommand 方案
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
textarea.style.left = '-9999px';
document.body.appendChild(textarea);
textarea.focus();
textarea.select();
try {
const success = document.execCommand('copy');
document.body.removeChild(textarea);
return success;
} catch (e) {
document.body.removeChild(textarea);
return false;
}
}


















