diff --git a/src/@core/utils/navigator.ts b/src/@core/utils/navigator.ts new file mode 100644 index 00000000..13f13f58 --- /dev/null +++ b/src/@core/utils/navigator.ts @@ -0,0 +1,19 @@ +// 请求和获取剪切板内容 +export async function getClipboardContent() { + return await navigator.clipboard.readText() +} + +// 将内容复制到剪切板,兼容非安全域场景 +export async function copyToClipboard(content: string) { + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(content) + } + else { + const input = document.createElement('input') + input.value = content + document.body.appendChild(input) + input.select() + document.execCommand('copy') + document.body.removeChild(input) + } +} diff --git a/src/views/setting/AccountSettingSearch.vue b/src/views/setting/AccountSettingSearch.vue index 6b8c356f..9b8ed473 100644 --- a/src/views/setting/AccountSettingSearch.vue +++ b/src/views/setting/AccountSettingSearch.vue @@ -3,6 +3,7 @@ import { useToast } from 'vue-toast-notification' import api from '@/api' import FilterRuleCard from '@/components/cards/FilterRuleCard.vue' import type { Site } from '@/api/types' +import { copyToClipboard, getClipboardContent } from '@/@core/utils/navigator' // 规则卡片类型 interface FilterCard { @@ -240,33 +241,33 @@ function shareRules() { .join('>') // 复制到剪切板 - navigator.clipboard.writeText(value) - .then(() => { - $toast.success('优先级规则已复制到剪切板') - }) - .catch(() => { - $toast.error('优先级规则复制失败!') - }) + try { + copyToClipboard(value) + $toast.success('优先级规则已复制到剪切板') + } + catch (error) { + $toast.error('优先级规则复制失败!') + } } // 导入规则 -function importRules() { - // 从剪切板读取 - navigator.clipboard.readText() - .then((value) => { - // 分割成数组 - const groups = value.split('>') - // 生成规则卡片 - filterCards.value = groups?.map((group: string, index: number) => { - return { - pri: (index + 1).toString(), - rules: group.split('&'), - } - }) - }) - .catch(() => { - $toast.error('从剪切版读取规则失败!') +async function importRules() { + try { + // 从剪切板读取 + const value = await getClipboardContent() + // 分割成数组 + const groups = value.split('>') + // 生成规则卡片 + filterCards.value = groups?.map((group: string, index: number) => { + return { + pri: (index + 1).toString(), + rules: group.split('&'), + } }) + } + catch (error) { + $toast.error('从剪切板读取数据失败!') + } } onMounted(() => { diff --git a/src/views/setting/AccountSettingSubscribe.vue b/src/views/setting/AccountSettingSubscribe.vue index 7277e2f1..d0bc4e98 100644 --- a/src/views/setting/AccountSettingSubscribe.vue +++ b/src/views/setting/AccountSettingSubscribe.vue @@ -3,6 +3,7 @@ import { useToast } from 'vue-toast-notification' import api from '@/api' import FilterRuleCard from '@/components/cards/FilterRuleCard.vue' import type { Site } from '@/api/types' +import { copyToClipboard, getClipboardContent } from '@/@core/utils/navigator' // 规则卡片类型 interface FilterCard { @@ -262,38 +263,38 @@ function shareRules(ruleType: string) { .join('>') // 复制到剪切板 - navigator.clipboard.writeText(value) - .then(() => { - $toast.success('优先级规则已复制到剪切板') - }) - .catch(() => { - $toast.error('优先级规则复制失败!') - }) + try { + copyToClipboard(value) + $toast.success('优先级规则已复制到剪切板') + } + catch (error) { + $toast.error('优先级规则复制失败!') + } } // 导入规则 -function importRules(ruleType: string) { +async function importRules(ruleType: string) { let filterCards: Ref if (ruleType === 'SubscribeFilterRules') filterCards = subscribeFilterCards else filterCards = bestVersionFilterCards + try { // 从剪切板读取 - navigator.clipboard.readText() - .then((value) => { - // 分割成数组 - const groups = value.split('>') - // 生成规则卡片 - filterCards.value = groups?.map((group: string, index: number) => { - return { - pri: (index + 1).toString(), - rules: group.split('&'), - } - }) - }) - .catch(() => { - $toast.error('从剪切版读取规则失败!') + const value = await getClipboardContent() + // 分割成数组 + const groups = value.split('>') + // 生成规则卡片 + filterCards.value = groups?.map((group: string, index: number) => { + return { + pri: (index + 1).toString(), + rules: group.split('&'), + } }) + } + catch (error) { + $toast.error('从剪切板读取数据失败!') + } } onMounted(() => {