mirror of
https://github.com/MengMengCode/CLICD.git
synced 2026-08-06 13:54:44 +08:00
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
export async function copyToClipboard(text: string): Promise<boolean> {
|
|
if (!text) return false
|
|
|
|
if (navigator.clipboard?.writeText) {
|
|
try {
|
|
await navigator.clipboard.writeText(text)
|
|
return true
|
|
} catch {
|
|
// Fall through for non-secure HTTP origins where Clipboard API is blocked.
|
|
}
|
|
}
|
|
|
|
const textarea = document.createElement('textarea')
|
|
textarea.value = text
|
|
textarea.setAttribute('readonly', '')
|
|
textarea.style.position = 'fixed'
|
|
textarea.style.top = '0'
|
|
textarea.style.left = '0'
|
|
textarea.style.width = '1px'
|
|
textarea.style.height = '1px'
|
|
textarea.style.opacity = '0'
|
|
textarea.style.pointerEvents = 'none'
|
|
|
|
const selection = document.getSelection()
|
|
const selectedRange = selection?.rangeCount ? selection.getRangeAt(0) : null
|
|
|
|
document.body.appendChild(textarea)
|
|
textarea.focus({ preventScroll: true })
|
|
textarea.select()
|
|
textarea.setSelectionRange(0, textarea.value.length)
|
|
|
|
let copied = false
|
|
try {
|
|
copied = document.execCommand('copy')
|
|
} finally {
|
|
document.body.removeChild(textarea)
|
|
if (selection && selectedRange) {
|
|
selection.removeAllRanges()
|
|
selection.addRange(selectedRange)
|
|
}
|
|
}
|
|
|
|
return copied
|
|
}
|