uni-app 的 uni.setclipboarddata 完全不支持自定义 mime 类型,仅跨端兼容纯文本;h5 端可通过 navigator.clipboard.write 实现多格式写入,但需 https、用户手势触发及 clipboarditem 构造;app 与小程序端均无 mime 控制能力;跨端带格式粘贴应采用 id 协议或服务端中转方案。

uni-app 无法直接写入自定义 MIME 类型
uni.setClipboardData 只接受 data 字符串参数,底层不暴露 clipboardData 对象,因此**完全不支持设置 text/html、application/json 或任意自定义 MIME 类型(如 application/x-myapp-data)**。它本质上是跨端封装的纯文本写入通道,所有平台最终都只存为 text/plain。
H5 端可用 navigator.clipboard.write 写自定义类型
只有 H5 环境能走原生 Clipboard API 的多格式写入路径,但必须满足全部硬性条件:
- 页面运行在 HTTPS 下(
http://localhost会报NotAllowedError) - 调用必须在用户手势(
click、tap)同步上下文中,不能进setTimeout或Promise.then - 需构造
ClipboardItem,例如:const htmlBlob = new Blob([htmlString], { type: 'text/html' });<br>const plainBlob = new Blob([plainText], { type: 'text/plain' });<br>await navigator.clipboard.write([<br> new ClipboardItem({<br> 'text/html': htmlBlob,<br> 'text/plain': plainBlob<br> })<br>]); - iOS Safari 需 16.4+ 才支持
text/html,旧版会静默忽略该类型
App 和小程序端只能降级为纯文本
Android/iOS App、微信/支付宝小程序均不提供对 clipboardData 的 DOM 访问能力,也没有等效的原生接口暴露 MIME 控制权:
- App 端:plus.clipboard 是纯字符串读写,无格式参数
- 小程序端:即使配置了
scope.writeClipboard,wx.setClipboardData底层也只走系统UIPasteboard/ClipboardManager的默认文本通道 - 所谓“粘贴到微信里显示加粗”,实为微信客户端自动解析 HTML 字符串的副作用,并非你真正写入了
text/html—— 它不可控、不标准、且在钉钉/飞书等其他 App 中大概率失效
想实现跨端带格式粘贴?别依赖剪贴板 MIME
真正稳定的做法是绕开剪贴板格式控制,改用语义化协议或服务端中转:
- 复制时只写一个唯一 ID(如
myapp://item?id=123),粘贴端检测到该 scheme 后主动拉取结构化数据 - 把富文本内容先存到后端,复制一个短链接(如
https://a.co/xyz),粘贴端通过 HTTP 获取完整 payload - 若仅限同 App 内流转,用本地 storage + 自定义事件通知比折腾剪贴板 MIME 更可靠
自定义 MIME 是浏览器 clipboard API 的高级能力,uni-app 的设计目标是跨端一致性,不是富格式剪贴板控制——这点在 iOS 14+ 之后尤其明显:系统已将剪贴板访问权限收得极紧,连读取都要弹窗,更别说写入私有类型。











