| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- import Clipboard from 'clipboard'
- import { decrypt } from '@/utils/crypto'
- /**
- * 复制文本到剪贴板
- * @param text 文本内容
- */
- export const copyText = (text: string) => {
- return new Promise((resolve, reject) => {
- const fakeElement = document.createElement('button')
- const clipboard = new Clipboard(fakeElement, {
- text: () => text,
- action: () => 'copy',
- container: document.body,
- })
- clipboard.on('success', e => {
- clipboard.destroy()
- resolve(e)
- })
- clipboard.on('error', e => {
- clipboard.destroy()
- reject(e)
- })
- document.body.appendChild(fakeElement)
- fakeElement.click()
- document.body.removeChild(fakeElement)
- })
- }
- // 读取剪贴板
- export const readClipboard = (): Promise<string> => {
- return new Promise((resolve, reject) => {
- if (navigator.clipboard?.readText) {
- navigator.clipboard.readText().then(text => {
- if (!text) reject('剪贴板为空或者不包含文本')
- return resolve(text)
- })
- }
- else reject('浏览器不支持或禁止访问剪贴板,请使用快捷键 Ctrl + V')
- })
- }
- // 解析加密后的剪贴板内容
- export const pasteCustomClipboardString = (text: string) => {
- let clipboardData
- try {
- clipboardData = JSON.parse(decrypt(text))
- }
- catch {
- clipboardData = text
- }
- return clipboardData
- }
- // 尝试解析剪贴板内容是否为Excel表格(或类似的)数据格式
- export const pasteExcelClipboardString = (text: string): string[][] | null => {
- const lines: string[] = text.split('\r\n')
- if (lines[lines.length - 1] === '') lines.pop()
- let colCount = -1
- const data: string[][] = []
- for (const index in lines) {
- data[index] = lines[index].split('\t')
- if (data[index].length === 1) return null
- if (colCount === -1) colCount = data[index].length
- else if (colCount !== data[index].length) return null
- }
- return data
- }
|