直接用 uni.setClipboardData 写入时间戳字符串即可,但必须先转成字符串,且 H5 端完全不支持——这是最常被忽略的跨端断点。

直接用 uni.setClipboardData 写入时间戳字符串即可,但必须先转成字符串,且 H5 端完全不支持——这是最常被忽略的跨端断点。
为什么不能直接传 Date.now() 给 uni.setClipboardData
因为 uni.setClipboardData 的 data 参数只接受字符串。传数字(如 Date.now())会静默转为空串,复制结果是空的,控制台也不报错。
- 错误写法:
uni.setClipboardData({ data: Date.now() })→ 真机测试时粘贴出来是空 - 正确写法:
uni.setClipboardData({ data: String(Date.now()) })或uni.setClipboardData({ data: Date.now().toString() }) - 如果需要带毫秒的可读格式(比如调试用),可用:
new Date().toISOString().replace('T', ' ').slice(0, -5),再传入
H5 端必须降级,否则点不动、没反应、也不提示
uni.setClipboardData 在 H5 下调用后直接静默失败。必须用 navigator.clipboard.writeText 替代,且满足三个硬条件:
- 页面必须运行在 HTTPS 或
localhost下,HTTP 会抛NotAllowedError - 调用必须在用户点击事件的第一层同步执行,不能包在
setTimeout、Promise.then或this.$nextTick里 - 旧版安卓 WebView(如 QQ 浏览器)可能不支持
navigator.clipboard,需 fallback 到document.execCommand('copy'),并手动创建textarea插入 DOM
怎么封装一个真正能用的跨端时间戳复制函数
别拼 if-else,用条件编译 + 统一 Promise 接口最稳:
async copyTimestamp() {
const ts = Date.now().toString();
// #ifdef APP-PLUS || MP
return uni.setClipboardData({ data: ts });
// #endif
// #ifdef H5
if (navigator.clipboard && window.isSecureContext) {
return navigator.clipboard.writeText(ts);
} else {
const el = document.createElement('textarea');
el.value = ts;
el.style.position = 'fixed';
el.style.opacity = '0';
document.body.appendChild(el);
el.select();
el.setSelectionRange(0, ts.length);
const result = document.execCommand('copy');
document.body.removeChild(el);
return Promise.resolve(result);
}
// #endif
}
调用时记得加 loading 状态防连点,成功后用 uni.showToast 提示,别漏掉 catch。
最容易被忽略的是:H5 降级逻辑里 el.select() 后必须跟 el.setSelectionRange(0, ts.length),iOS Safari 不认前者,不加这句就复制失败。


















