首页 > 其他分享 >JS通过 navigator.clipboard.writeText(textToCopy) 实现文本复制,navigator.clipboard报undefined问题

JS通过 navigator.clipboard.writeText(textToCopy) 实现文本复制,navigator.clipboard报undefined问题

时间:2023-06-07 10:25:40浏览次数:33  
标签:writeText modal textArea clipboard proxy 复制 navigator

问题描述

代码:

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.1localhost

解决方案

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("复制失败");
    }
  );
}

标签:writeText,modal,textArea,clipboard,proxy,复制,navigator
From: https://www.cnblogs.com/echohye/p/17462567.html

相关文章

  • Navigator.sendBeacon()
    navigator.sendBeacon()方法可用于通过HTTPPOST将少量数据异步传输到Web服务器。这个方法主要用于满足统计和诊断代码的需要,这些代码通常尝试在卸载(unload)文档之前向Web服务器发送数据。过早的发送数据可能导致错过收集数据的机会。然而,对于开发者来说保证在文档卸载期间发......
  • 解决http下navigator.clipboard为undefined的问题
    clipboard只有在安全域名下才可以访问(https、localhost),而http域名下只能得到undefined。例如现在想要实现点击"分享"按钮,将当前页面的url复制到剪贴板:constclipboard=navigator.clipboardif(clipboard){clipboard.writeText(window.location.href)}在本......
  • mac版anaconda navigator无法打开
    https://docs.anaconda.com/navigator/troubleshooting/#id6 终端输入conda info 或者直接试试: sudorm-rf.continuum https://blog.csdn.net/JasonWho_sysu/article/details/90413625/在终端中输入psaux|grepanaconda-navigator在终端中输入kill-9PID 本......
  • 使用navigator.geolocation解决h5公众号定位不准确的问题
    封装js(utils/geolocation.min.js):window.qq=window.qq||{},qq.maps=qq.maps||{},window.soso||(window.soso=qq),soso.maps||(soso.maps=qq.maps),qq.maps.Geolocation=function(){"usestrict";vare=[],t=null,o=0,n="_geoIframe_"+Math.ceil(1e7*Mat......
  • 使用navigator.userAgent 判断当前浏览器所处的环境
    https://blog.csdn.net/banana960531/article/details/86572475浏览器对于我们来说,可能是最熟悉的工具了。熟知的浏览器Firefox、Opera、Safari、IE、Chrome以外,据说世界上还有近百种浏览器。通常在开发的时候要做到兼容各种浏览器,因此提炼出判断浏览器类型及系统是很重要的。先......
  • clipboard.js多次执行
     <ahref="javascript:void(0)"onclick="cloneCode('codeBtn');"data-clipboard-text="aaaa"id="codeBtn">复制券码</a> varclipboard;//这里定义全局变量 funct......
  • Vue3 点击复制功能,利用vue-clipboard3
    首先安装插件vue-clipboard3 npminstallvue-clipboard3--save然后在页面里面引入<buttonclass="btn"@click="copy()">点击复制</button>  建议用buttn标签......
  • vue3 + vue-clipboard3 复制文本到剪切板
    1.安装yarnaddvue-clipboard32.引入importuseClipboardfrom'vue-clipboard3';3.html部分<n-buttontertiarytype="primary"ref="copyBtn"@click="copyP......
  • DBNaVigator组件的使用方法
    DBNavigator组件用于在数据集进行记录导航,当用户单击DBNaVigator组件的某个按钮时,可实现记录指针的前移、后移,插入‘删除、修改当前记录等操作,而无须编写任何程序代码。......
  • navigator
    <navigatorurl="/pages/list/list">新闻列表</navigator>注意:绝对路径前面前面要加一个/创建文件是scss类型的最后路径的结尾不能加.vue ......