前端必备:一套通用的 JS 复制功能(保留/去掉换行,兼容 PC/移动端/微信)
前言 在前端开发中,我们经常会遇到"复制文本到剪贴板"的需求,比如复制账号、复制表格数据、批量复制命令等。 然而,很多同学写的复制功能:
- 有时候粘贴出来换行没了
- 有时候在移动端、微信内置浏览器里完全没反应
- 复制长文本时被截断
本文给大家带来一份终极通用版复制方法,支持: ✅ 保留换行 / 去掉换行 ✅ 兼容 PC / 移动端 / 微信内置浏览器 / 支付宝 WebView ✅ 支持超长文本 ✅ 带成功/失败回调,方便 UI 提示 ✅ 不污染页面,不会触发滚动
复制方法实现
javascript
/**
* 通用复制方法
* @param {string} value 要复制的文本
* @param {Object} options 额外配置
* @param {boolean} options.keepLineBreak 是否保留换行(默认 true)
* @param {Function} options.onSuccess 复制成功回调
* @param {Function} options.onError 复制失败回调
*/
function copyFn(value, {
keepLineBreak = true,
onSuccess = () => {},
onError = () => {}
} = {}) {
try {
// 创建元素(textarea 支持换行,input 只能单行)
const el = keepLineBreak ? document.createElement("textarea") : document.createElement("input");
// 设置文本,去掉换行时替换为一个空格
el.value = keepLineBreak ? value : value.replace(/\n/g, ' ');
// 防止页面滚动闪动
el.style.position = "fixed";
el.style.top = "-9999px";
el.style.left = "-9999px";
el.style.opacity = "0";
document.body.appendChild(el);
el.select();
el.setSelectionRange(0, el.value.length); // 移动端兼容
const success = document.execCommand("copy");
document.body.removeChild(el);
if (success) {
onSuccess();
} else {
throw new Error("复制命令返回 false");
}
} catch (err) {
console.error("复制失败:", err);
onError(err);
}
}
使用示例
- 保留换行
javascript
let text1 = '';
for (let i = 0; i < 5; i++) {
text1 += `行 ${i + 1}: Hello World\n`;
}
copyFn(text1, {
keepLineBreak: true,
onSuccess: () => console.log("复制成功(带换行)"),
onError: (err) => console.error(err)
});
粘贴结果:
yaml
行 1: Hello World
行 2: Hello World
行 3: Hello World
行 4: Hello World
行 5: Hello World
- 去掉换行
javascript
let text2 = '';
for (let i = 0; i < 5; i++) {
text2 += `行 ${i + 1}: Hello World\n`;
}
copyFn(text2, {
keepLineBreak: false,
onSuccess: () => console.log("复制成功(无换行)")
});
粘贴结果:
yaml
行 1: Hello World 行 2: Hello World 行 3: Hello World 行 4: Hello World 行 5: Hello World
兼容性分析
- PC 浏览器:完美兼容(Chrome / Edge / Firefox / Safari / IE 10+)
- 移动端浏览器:兼容安卓、iOS
- 微信 / 支付宝内置浏览器:可用
- 超长文本:使用 textarea 可支持大文本复制,不会被截断
进阶优化 为了提升成功率,可以在新浏览器上优先使用 navigator.clipboard.writeText,老浏览器再回退到 execCommand,这样能做到几乎 100% 复制成功。
可升级版本示例:
javascript
async function smartCopy(text) {
try {
if (navigator.clipboard && window.isSecureContext) {
await navigator.clipboard.writeText(text);
console.log("复制成功(Clipboard API)");
} else {
copyFn(text);
}
} catch (err) {
console.error("复制失败:", err);
}
}
总结 本文给大家封装的 copyFn 方法: 一行代码搞定复制功能 保留换行 / 去掉换行随意切换 兼容各种复杂环境 可扩展成 Clipboard API 双引擎版本 复制功能虽小,但在实际业务中用得很频繁,封装好一套稳定的工具函数,可以让你的项目更健壮、更好维护。
💬 你在项目中还遇到过哪些复制相关的坑?欢迎评论区交流~