| /** | 
| * v-copyText 复制文本内容 | 
| * Copyright (c) 2022 ruoyi | 
| */ | 
|   | 
| export default { | 
|   beforeMount(el, { value, arg }) { | 
|     if (arg === "callback") { | 
|       el.$copyCallback = value; | 
|     } else { | 
|       el.$copyValue = value; | 
|       const handler = () => { | 
|         copyTextToClipboard(el.$copyValue); | 
|         if (el.$copyCallback) { | 
|           el.$copyCallback(el.$copyValue); | 
|         } | 
|       }; | 
|       el.addEventListener("click", handler); | 
|       el.$destroyCopy = () => el.removeEventListener("click", handler); | 
|     } | 
|   } | 
| } | 
|   | 
| function copyTextToClipboard(input, { target = document.body } = {}) { | 
|   const element = document.createElement('textarea'); | 
|   const previouslyFocusedElement = document.activeElement; | 
|   | 
|   element.value = input; | 
|   | 
|   // Prevent keyboard from showing on mobile | 
|   element.setAttribute('readonly', ''); | 
|   | 
|   element.style.contain = 'strict'; | 
|   element.style.position = 'absolute'; | 
|   element.style.left = '-9999px'; | 
|   element.style.fontSize = '12pt'; // Prevent zooming on iOS | 
|   | 
|   const selection = document.getSelection(); | 
|   const originalRange = selection.rangeCount > 0 && selection.getRangeAt(0); | 
|   | 
|   target.append(element); | 
|   element.select(); | 
|   | 
|   // Explicit selection workaround for iOS | 
|   element.selectionStart = 0; | 
|   element.selectionEnd = input.length; | 
|   | 
|   let isSuccess = false; | 
|   try { | 
|     isSuccess = document.execCommand('copy'); | 
|   } catch { } | 
|   | 
|   element.remove(); | 
|   | 
|   if (originalRange) { | 
|     selection.removeAllRanges(); | 
|     selection.addRange(originalRange); | 
|   } | 
|   | 
|   // Get the focus back on the previously focused element, if any | 
|   if (previouslyFocusedElement) { | 
|     previouslyFocusedElement.focus(); | 
|   } | 
|   | 
|   return isSuccess; | 
| } |