对比新文件 |
| | |
| | | // #ifdef APP-VUE || H5 |
| | | /** |
| | | * v-copyText 澶嶅埗鏂囨湰鍐呭 |
| | | * Copyright (c) 2022 ruoyi |
| | | * v-copyText="瑕佸鍒剁殑鏂囨湰鍐呭" |
| | | * v-copyText:callback="澶嶅埗鎴愬姛鍚庣殑鍥炶皟鍑芥暟" |
| | | * 鐐瑰嚮琚爣娉ㄧ殑鍏冪礌鍗冲彲澶嶅埗鏂囨湰鍐呭 |
| | | */ |
| | | |
| | | import type { Directive, DirectiveBinding } from "vue"; |
| | | interface ElType extends HTMLElement { |
| | | $copyValue: string; |
| | | $copyCallback: Function; |
| | | $destroyCopy:Function; |
| | | } |
| | | const vCopyText:Directive = { |
| | | beforeMount(el:ElType , binding:DirectiveBinding) { |
| | | if (binding.arg === "callback") { |
| | | el.$copyCallback = binding.value; |
| | | } else { |
| | | el.$copyValue = binding.value; |
| | | const handler = () => { |
| | | copyTextToClipboard(el.$copyValue); |
| | | if (el.$copyCallback) { |
| | | el.$copyCallback(el.$copyValue); |
| | | } |
| | | }; |
| | | el.addEventListener("click", handler); |
| | | el.$destroyCopy = () => el.removeEventListener("click", handler); |
| | | } |
| | | } |
| | | } |
| | | export default vCopyText; |
| | | |
| | | function copyTextToClipboard(input:string, { target = document.body } = {}) { |
| | | const element = document.createElement('textarea'); |
| | | const previouslyFocusedElement = document.activeElement as HTMLElement; |
| | | |
| | | 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(); |
| | | if(!selection)return |
| | | 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; |
| | | } |
| | | // #endif |