JS通过 navigator.clipboard.writeText(textToCopy) 实现文本复制,navigator.clipboard报undefined问题
问题描述
代码:
let geometries = qChart.value
.filter((e) => e.geometry)
.map((e) => e?.geometry);
navigator.clipboard
.writeText(JSON.stringify(geometries))
.then(() => {
proxy.$modal.msgSuccess("已复制");
})
.catch(() => {
proxy.$modal.msgSuccess("复制失败");
});
测试环境下可以正常复制 ,但放到线上会报错:找不到 .writeText
问题分析
在 Chrome 的 DevTools 控制台下执行 navigator.clipboard 返回 undefined
,经查找资料发现是浏览器禁用了非安全域的 navigator.clipboard
对象,哪些地址是安全的呢?
安全域包括本地访问与开启TLS安全认证的地址,如 https 协议的地址
、127.0.0.1
或 localhost
。
解决方案
let geometries = qChart.value
.filter((e) => e.geometry)
.map((e) => e?.geometry);
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard
.writeText(JSON.stringify(geometries))
.then(() => {
proxy.$modal.msgSuccess("已复制");
})
.catch(() => {
proxy.$modal.msgSuccess("复制失败");
});
} else {
// 创建text area
const textArea = document.createElement("textarea");
textArea.value = JSON.stringify(geometries);
// 使text area不在viewport,同时设置不可见
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
new Promise((resolve, reject) => {
// 执行复制命令并移除文本框
document.execCommand("copy") ? resolve() : reject(new Error("出错了"));
textArea.remove();
}).then(
() => {
proxy.$modal.msgSuccess("已复制");
},
() => {
proxy.$modal.msgSuccess("复制失败");
}
);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!