初始化
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
export const copyToClipboard = async (text: string) => {
|
||||
// 1. 首先尝试使用现代 Clipboard API
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
try {
|
||||
await navigator.clipboard.writeText(text);
|
||||
return { success: true, method: 'clipboard-api' };
|
||||
} catch (error) {
|
||||
console.warn('Clipboard API 失败,尝试降级方法:', error);
|
||||
// 如果失败,继续尝试降级方案
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 降级方案:使用 textarea + execCommand
|
||||
try {
|
||||
// 创建一个临时的 textarea 元素
|
||||
const textArea = document.createElement('textarea');
|
||||
textArea.value = text;
|
||||
|
||||
// 防止在iOS上缩放
|
||||
textArea.style.fontSize = '12pt';
|
||||
// 重置盒模型
|
||||
textArea.style.border = '0';
|
||||
textArea.style.padding = '0';
|
||||
textArea.style.margin = '0';
|
||||
// 使元素绝对定位,脱离可视区域
|
||||
textArea.style.position = 'absolute';
|
||||
textArea.style.left = '-9999px';
|
||||
|
||||
// 获取当前滚动位置,防止页面滚动
|
||||
const scrollY = window.scrollY || document.documentElement.scrollTop;
|
||||
const isRTL = document.documentElement.getAttribute('dir') === 'rtl';
|
||||
if (isRTL) {
|
||||
textArea.style.right = '-9999px';
|
||||
}
|
||||
|
||||
// 将 textarea 添加到页面中
|
||||
document.body.append(textArea);
|
||||
|
||||
// 选中文本
|
||||
textArea.select();
|
||||
textArea.setSelectionRange(0, textArea.value.length); // 兼容移动设备
|
||||
|
||||
// 执行复制命令
|
||||
const success = document.execCommand('copy');
|
||||
|
||||
// 移除 textarea
|
||||
textArea.remove();
|
||||
|
||||
// 恢复滚动位置
|
||||
window.scrollTo(0, scrollY);
|
||||
|
||||
if (success) {
|
||||
return { success: true, method: 'execCommand' };
|
||||
} else {
|
||||
throw new Error('execCommand 复制失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
console.error('所有复制方法均失败:', error);
|
||||
return {
|
||||
success: false,
|
||||
method: null,
|
||||
error: error.message,
|
||||
};
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user