copy.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // +----------------------------------------------------------------------
  2. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  3. // +----------------------------------------------------------------------
  4. // | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
  5. // +----------------------------------------------------------------------
  6. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  7. // +----------------------------------------------------------------------
  8. // | Author: CRMEB Team <admin@crmeb.com>
  9. // +----------------------------------------------------------------------
  10. import { Message } from 'element-ui';
  11. const vCopy = {
  12. // 名字爱取啥取啥
  13. /*
  14. bind 钩子函数,第一次绑定时调用,可以在这里做初始化设置
  15. el: 作用的 dom 对象
  16. value: 传给指令的值,也就是我们要 copy 的值
  17. */
  18. bind(el, { value }) {
  19. el.$value = value; // 用一个全局属性来存传进来的值,因为这个值在别的钩子函数里还会用到
  20. el.handler = () => {
  21. if (!el.$value) {
  22. // 值为空的时候,给出提示,我这里的提示是用的 element-ui 的提示,你们随意
  23. Message.warning('无复制内容');
  24. return;
  25. }
  26. // 动态创建 textarea 标签
  27. const textarea = document.createElement('textarea');
  28. // 将该 textarea 设为只读,同时将 textarea 移出可视区域
  29. textarea.readOnly = 'readonly';
  30. textarea.style.position = 'absolute';
  31. textarea.style.left = '-9999px';
  32. // 将要 copy 的值赋给 textarea 标签的 value 属性
  33. textarea.value = el.$value;
  34. // 将 textarea 插入到 body 中
  35. document.body.appendChild(textarea);
  36. // 选中值并复制
  37. textarea.select();
  38. textarea.setSelectionRange(0, textarea.value.length);
  39. //就是可以通过设置起始于终止位置,来选中一段文本中的一部分,这里其实就是全选
  40. const result = document.execCommand('Copy');
  41. //html原生的复制功能
  42. /**
  43. * 拓展
  44. * :document.execCommand(”selectAll”) 全选
  45. * :document.execCommand(open) 打开
  46. * :document.execCommand(saveAs) 另存为
  47. */
  48. if (result) {
  49. Message.success('复制成功');
  50. }
  51. document.body.removeChild(textarea);
  52. //复制成功然后删除textarea标签
  53. };
  54. // 绑定点击事件,就是所谓的一键 copy 啦
  55. el.addEventListener('click', el.handler);
  56. },
  57. // 当传进来的值更新的时候触发
  58. componentUpdated(el, { value }) {
  59. el.$value = value;
  60. },
  61. // 指令与元素解绑的时候,移除事件绑定
  62. unbind(el) {
  63. el.removeEventListener('click', el.handler);
  64. },
  65. };
  66. //使用示例 <el-button v-copy="info">复制</el-button>
  67. //data() {
  68. // return {
  69. // info:'要复制的内容'
  70. // }
  71. export default vCopy;