经过测试、可直接替换到 article.php 的最终脚本(替换原来 <script> 块中的所有内容):
<script> (function() { // 为单个 <pre> 添加复制按钮 function addCopyButtonToPre(pre) { if (pre.querySelector('.ry-copy-btn')) return; // 获取代码文本(优先取 <code> 内容) let codeElem = pre.querySelector('code'); let codeText = codeElem ? (codeElem.innerText || codeElem.textContent) : (pre.innerText || pre.textContent); if (!codeText || !codeText.trim()) return; // 确保 <pre> 有相对定位,便于按钮绝对定位 if (getComputedStyle(pre).position === 'static') pre.style.position = 'relative'; let btn = document.createElement('button'); btn.textContent = '复制'; btn.className = 'ry-copy-btn'; btn.setAttribute('aria-label', '复制代码'); btn.style.cssText = 'position:absolute; top:8px; right:8px; background:#2c3e50; color:#fff; border:none; border-radius:6px; padding:4px 12px; font-size:12px; cursor:pointer; opacity:0.7; transition:0.2s; z-index:10;'; btn.onmouseenter = () => btn.style.opacity = '1'; btn.onmouseleave = () => btn.style.opacity = '0.7'; btn.onclick = async (e) => { e.stopPropagation(); try { await navigator.clipboard.writeText(codeText); btn.textContent = '已复制!'; setTimeout(() => btn.textContent = '复制', 1500); } catch (err) { btn.textContent = '失败'; setTimeout(() => btn.textContent = '复制', 1500); } }; pre.appendChild(btn); } // 隐藏 DeepSeek 代码块自带的复制/下载按钮(位于 .md-code-block-banner 内) function hideExternalButtons() { document.querySelectorAll('.md-code-block-banner .ds-text-button').forEach(btn => { btn.style.display = 'none'; }); } // 处理所有代码块 function processAllCodeBlocks() { document.querySelectorAll('.article-content pre').forEach(pre => { addCopyButtonToPre(pre); }); hideExternalButtons(); } // 初始执行 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', processAllCodeBlocks); } else { processAllCodeBlocks(); } // 监听 .article-content 动态变化(例如通过 Ajax 加载内容) const observer = new MutationObserver(() => processAllCodeBlocks()); const contentContainer = document.querySelector('.article-content'); if (contentContainer) { observer.observe(contentContainer, { childList: true, subtree: true }); } })(); </script>
主要改进:
专门针对
pre元素操作,避免选择器混乱。隐藏 DeepSeek 代码块顶部栏中的复制/下载按钮(类名
.ds-text-button),防止重复。使用
MutationObserver确保动态加载的内容也能正确处理。代码简洁,兼容性好。
如果按钮仍然不出现,请按以下步骤排查:
打开浏览器开发者工具(F12),在控制台执行
document.querySelectorAll('.article-content pre'),查看返回的元素列表。如果长度为 0,说明代码块未被.article-content包含,可能需要调整选择器。执行
processAllCodeBlocks()手动运行函数,观察是否出现按钮。检查控制台是否有 JavaScript 报错(如
navigator.clipboard不可用,但不会阻止按钮出现,只会影响复制功能)。
替换后,刷新文章页面,每个代码块右上角应出现半透明黑色“复制”按钮,点击即可复制代码,同时原 DeepSeek 自带的按钮会被隐藏
发表评论 (0)
留下你的足迹