JS复制文字到剪贴板,实现多行复制(保留换行符)与 非input/textarea元素复制

此文记录一下楼主遇到的坑

内容都是实际运行过的 请放心使用

1、实现JS环境中复制文字到剪贴板

主要应用场景为方便用户复制内容 提升用户体验(比如订单号?git clone的地址?等)

去度娘一搜 好家伙 一大堆 然后时间一看 好家伙 排到前面的都是2014年的回答,大部分回答都还一样???

经过MDN 等多方查证,现总结如下

javascript 复制代码
      let tx = document.getElementById('copycon') 或者  tx = this.$refs.copycon (vue环境)
      // 创建select对象与range对象
      const selection = window.getSelection()
      const range = document.createRange()
      // 从当前selection对象中移除所有的range对象, 
      // 取消所有的选择只 留下anchorNode 和focusNode属性并将其设置为null。
      // 这里没弄明白为什么需要先remove一下, 也没有太多资料查证 没有这句会复制失败
      if(selection.rangeCount > 0) selection.removeAllRanges()
      // 使 Range 包含某个节点的内容 使用这个 或者下面的selectNode都可以
      // range.selectNodeContents(tx)

      // 使 Range 包含某个节点及其内容
      range.selectNode(tx)
      // 向选区(Selection)中添加一个区域(Range)
      selection.addRange(range)
      // 已复制文字
      // console.log('selectedText', selection.toString())
      // 执行浏览器复制命令
      document.execCommand('copy')

点击后即可选中,并将div里的内容复制到剪贴板,使用时直接ctrl + v 即可

但是这种方法楼主没有找到复制多个的方法,即假如我现在有2个div的内容是需要复制的 无法重复添加 只能去先一步获取并拼接(dom.innerHTML)

贴一下mdn上的循环添加获取 楼主去撸了一遍代码 发现并不能实现

循环无法实现 只能复制到第一个dom的内容

2、实现input / textarea中的复制

后来我又发现使用input / textarea进行复制操作 这种方式更加简单 因为二者有一个select() 函数能够便捷的复制而不需要去创建select对象与range对象

如下

javascript 复制代码
      let input = document.createElement('input')
      input.setAttribute('readonly', 'readonly') // 防止手机上弹出软键盘
      input.setAttribute('value', txval) // txval 为所需复制的值 变量 或者 写死
      document.body.appendChild(input)
      input.select()
      document.execCommand('copy')
      document.body.removeChild(input)

这里动态创建一个input 然后再最后remove就好,而不需要在html中硬性使用input / textarea去展示,更加优雅

但是此处注意 当你的txval为多个值拼接 并需要在剪贴板换行时 此方法无法满足

比如你需要这种格式

console打印都是ok的 但是实际复制到文本文档中是一行

要实现换行请使用textarea

javascript 复制代码
      let that = this
      let txa = document.createElement('textarea')
      let txval = 'SN:' + that.sn1 + '\n' + 'MAC:' + that.mac1 + '\n' + 'IMEI:' + that.imei1 + '\n' + 'PORT:' + that.port1
      // console.log('copy val:', txval)
      txa.value = txval
      document.body.appendChild(txa)
      txa.select()
      let res = document.execCommand('copy')
      document.body.removeChild(txa)
      console.log('copy success')

至此完毕

相关推荐
toooooop833 分钟前
CRMEB 故障排查笔记:安全网关只放行 GET/POST 怎么办
前端·javascript·vue.js·thinkphp6·crmeb
软件技术NINI44 分钟前
基于SpringBoot和Vue的项目评审系统
javascript·vue.js·spring boot·后端·spring·毕业设计·毕设
vipxieliang1 小时前
JavaScript 模板字符串与标签模板:不只是拼接
前端·javascript
Dream-Y.ocean11 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Highcharts.js12 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
kyriewen15 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
工控丫丫16 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
Dream-Y.ocean18 小时前
鸿蒙PC平台星图遥感适配实战:基于 Electron 壳方案的纯 JavaScript 遥感图像处理引擎开发
javascript·electron·harmonyos
螺丝钉tina19 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
Highcharts.js21 小时前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格