3 changed files with 73 additions and 0 deletions
@ -0,0 +1,66 @@ |
|||
/** |
|||
* 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; |
|||
} |
|||
@ -1,7 +1,9 @@ |
|||
import hasRole from './permission/hasRole' |
|||
import hasPermi from './permission/hasPermi' |
|||
import copyText from './common/copyText' |
|||
|
|||
export default function directive(app){ |
|||
app.directive('hasRole', hasRole) |
|||
app.directive('hasPermi', hasPermi) |
|||
app.directive('copyText', copyText) |
|||
} |
|||
Loading…
Reference in new issue