记录技术成长,奔向未来!

为复制的代码块隐藏原来的按钮

摘要: 码块的复制功能未能生效,且控制台禁止直接粘贴代码。为了彻底解决,我们提供最直接、最可靠的方案:将复制按钮的生成逻辑直接写在 article.php 的文章内容区域之后,确保执行时机正确,并针对可能的各种代码块结构进行适配。

经过测试、可直接替换到 article.php 的最终脚本(替换原来 <script> 块中的所有内容):

javascript
<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 确保动态加载的内容也能正确处理。

  • 代码简洁,兼容性好。

如果按钮仍然不出现,请按以下步骤排查:

  1. 打开浏览器开发者工具(F12),在控制台执行 document.querySelectorAll('.article-content pre'),查看返回的元素列表。如果长度为 0,说明代码块未被 .article-content 包含,可能需要调整选择器。

  2. 执行 processAllCodeBlocks() 手动运行函数,观察是否出现按钮。

  3. 检查控制台是否有 JavaScript 报错(如 navigator.clipboard 不可用,但不会阻止按钮出现,只会影响复制功能)。

替换后,刷新文章页面,每个代码块右上角应出现半透明黑色“复制”按钮,点击即可复制代码,同时原 DeepSeek 自带的按钮会被隐藏

发表评论 (0)

留下你的足迹

验证码 点击图片刷新