From a5f50bc24ed540d49b1d2dbcdb34dbdb1d6b51b3 Mon Sep 17 00:00:00 2001 From: Cb1ock Date: Tue, 4 Nov 2025 13:24:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=A4=8D=E5=88=B6=E6=8C=89=E9=92=AE=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=8E=B0=E4=BB=A3=E5=89=AA=E8=B4=B4=E6=9D=BF?= =?UTF-8?q?API=E5=92=8C=E9=99=8D=E7=BA=A7=E6=96=B9=E6=A1=88=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/js/main.js | 77 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 13 deletions(-) diff --git a/static/js/main.js b/static/js/main.js index fe8ac26..4b767ef 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -909,25 +909,39 @@ class SnapSolver { // 添加点击事件 copyBtn.addEventListener('click', async () => { + const codeText = codeBlock.textContent; + try { - const codeText = codeBlock.textContent; - await navigator.clipboard.writeText(codeText); + // 尝试使用现代 Clipboard API + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(codeText); + this.showCopySuccess(copyBtn); + return; + } - // 更新按钮状态 - copyBtn.innerHTML = ' 已复制'; - copyBtn.classList.add('copied'); + // 降级方案:使用传统的 document.execCommand + const textArea = document.createElement('textarea'); + textArea.value = codeText; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + textArea.style.top = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); - // 显示提示 - window.uiManager?.showToast('代码已复制到剪贴板', 'success'); + const successful = document.execCommand('copy'); + document.body.removeChild(textArea); + + if (successful) { + this.showCopySuccess(copyBtn); + } else { + throw new Error('execCommand failed'); + } - // 2秒后恢复原状 - setTimeout(() => { - copyBtn.innerHTML = ' 复制'; - copyBtn.classList.remove('copied'); - }, 2000); } catch (error) { console.error('复制失败:', error); - window.uiManager?.showToast('复制失败,请手动选择复制', 'error'); + // 最后的降级方案:选中文本让用户手动复制 + this.selectTextForManualCopy(codeBlock, copyBtn); } }); @@ -936,6 +950,43 @@ class SnapSolver { }); } + // 显示复制成功状态 + showCopySuccess(copyBtn) { + copyBtn.innerHTML = ' 已复制'; + copyBtn.classList.add('copied'); + window.uiManager?.showToast('代码已复制到剪贴板', 'success'); + + // 2秒后恢复原状 + setTimeout(() => { + copyBtn.innerHTML = ' 复制'; + copyBtn.classList.remove('copied'); + }, 2000); + } + + // 选中文本供用户手动复制 + selectTextForManualCopy(codeBlock, copyBtn) { + // 选中代码文本 + const range = document.createRange(); + range.selectNodeContents(codeBlock); + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + + // 更新按钮状态 + copyBtn.innerHTML = ' 已选中'; + copyBtn.classList.add('copied'); + + // 显示提示 + window.uiManager?.showToast('代码已选中,请按 Ctrl+C 复制', 'info'); + + // 3秒后恢复原状 + setTimeout(() => { + copyBtn.innerHTML = ' 复制'; + copyBtn.classList.remove('copied'); + selection.removeAllRanges(); + }, 3000); + } + initializeCropper() { try { // 如果当前没有截图,不要初始化裁剪器