v-copy.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import Vue from "vue";
  2. // 注册一个全局自定义复制指令 `v-copy`
  3. Vue.directive("copy", {
  4. bind(el, { value }) {
  5. el.$value = value;
  6. el.handler = () => {
  7. el.style.position = 'relative';
  8. if (!el.$value) {
  9. // 值为空的时候,给出提示
  10. // alert('无复制内容');
  11. uni.showToast({
  12. title:"无复制内容"
  13. })
  14. return
  15. }
  16. // 动态创建 textarea 标签
  17. const textarea = document.createElement('textarea');
  18. // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
  19. textarea.readOnly = 'readonly';
  20. textarea.style.position = 'absolute';
  21. textarea.style.top = '0px';
  22. textarea.style.left = '-9999px';
  23. textarea.style.zIndex = '-9999';
  24. // 将要 copy 的值赋给 textarea 标签的 value 属性
  25. textarea.value = el.$value
  26. // 将 textarea 插入到 el 中
  27. el.appendChild(textarea);
  28. // 兼容IOS 没有 select() 方法
  29. if (textarea.createTextRange) {
  30. textarea.select(); // 选中值并复制
  31. } else {
  32. textarea.setSelectionRange(0, el.$value.length);
  33. textarea.focus();
  34. }
  35. const result = document.execCommand('Copy');
  36. if (result) {
  37. uni.showToast({
  38. title:"复制成功"
  39. })
  40. }
  41. el.removeChild(textarea);
  42. }
  43. el.addEventListener('click', el.handler); // 绑定点击事件
  44. },
  45. // 当传进来的值更新的时候触发
  46. componentUpdated(el, { value }) {
  47. el.$value = value;
  48. },
  49. // 指令与元素解绑的时候,移除事件绑定
  50. unbind(el) {
  51. el.removeEventListener('click', el.handler);
  52. },
  53. });