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 { // 如果当前没有截图,不要初始化裁剪器