JS实现复制功能的三种方式,有坑

刺骨的言语ヽ痛彻心扉 2023-02-11 07:14 36阅读 0赞

简介

业余时间写了一个在微信里面分享X宝优惠券的小工具,里面有用到复制淘口令的功能,当时以为实现起来很…简单,但是一不留神还是踩了个坑,接下来就给大家分享一下。
实现效果

  • 页面布局代码传送门:https://www.jianshu.com/p/fceec5bf1beb

第一种:浏览器Copy功能

HTML代码

  1. <textarea cols="20" rows="10" id="tkl">
  2. 素乐小风扇usb便携式手持小型随身可充电学生宿舍女桌面办公室桌上手拿握迷你电小米大风力超静音n9儿童电扇
  3. 【在售价】48
  4. 【券后价】38.00
  5. 【返红包】0.33
  6. --------------------
  7. 【领券下单】复制¥1ikI1q4OnJk¥打开手机淘宝领券并下单</textarea>
  8. <input type="button" onClick="copyTkl()" value="立即领券" />

JS代码

  1. <script type="text/javascript">
  2. function copyTkl() {
  3. var tkl=document.getElementById("tkl");
  4. tkl.select();
  5. document.execCommand("Copy");
  6. alert("复制淘口令成功......");
  7. }
  8. </script>

原理:

  • 获取textarea文本域数据
  • 选中复制对象
  • 执行浏览器复制命令

在微信开发工具里面一切正常,但是在真机使用时iphone 有些机型不能复制到数据。
现象之一:iphone X第一次打开页面复制正常,但是同一个页面第二次及以后就不能再复制到数据。

第二种:clipboard.js

下载地址:https://github.com/zenorocha/clipboard.js/archive/master.zip

HTML代码

  1. <input type="text" id="tkl" />
  2. <button type="button" id="copyTkl">立即领券</button>

JS代码

  1. <!--引入插件-->
  2. <script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script>
  3. <script type="text/javascript">
  4. $('#copy').on('click', function () {
  5. var value = $('#copyTkl').val();
  6. $('#copyTkl').attr('data-clipboard-text', value);
  7. var clipboard = new Clipboard('#copyTkl');
  8. clipboard.on('success', function (e) {
  9. alert("复制淘口令成功......");
  10. });
  11. clipboard.on('error', function (e) {
  12. alert("复制淘口令失败......");
  13. });
  14. })
  15. </script>

参数说明

浏览器支持

  • Chrome 42 +
  • Edge12 +
  • Firefox 41 +
  • IE 9 +
  • Opera 29 +
  • Safari 10 +

使用总结:PC上基本可以畅通无阻,移动端要改源码,在实现过程中还解决了一系列问题,例如:动态数据复制、div换button 、和项目中本身代码的禁用事件冲突等,并且还要做机型适配。

第三种:纯JS,对第一种进行改进

网上有很多的例子,总结起来就两种:1、clipboard.js 2、纯JS 经过取舍clipboard.js放弃,因为不确定因素太多。那么就修改第一种方法的实现。

JS代码

  1. function copyTkl() {
  2. const range = document.createRange();
  3. range.selectNode(document.getElementById('tkl'));
  4. const selection = window.getSelection();
  5. if (selection.rangeCount > 0) selection.removeAllRanges();
  6. selection.addRange(range);
  7. document.execCommand('copy');
  8. alert("复制淘口令成功......");
  9. }

经测试,目前还没有发现问题,有兴趣的可以尝试一下!

发表评论

表情:
评论列表 (有 0 条评论,36人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL复制方式

    复制表结构及其数据 ## 下面这个语句会拷贝数据到新表中。 注意:这个语句其实只是把select语句的结果建一个表,所以新表不会有主键,索引。 create ta...