掘金自由复制代码按钮

跳过登录,直接复制代码,按钮显示“自由复制”

// ==UserScript==
// @name         掘金自由复制代码按钮
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  跳过登录,直接复制代码,按钮显示“自由复制”
// @match        *://juejin.cn/*
// @grant        GM_setClipboard
// @license MIT 
// ==/UserScript==

(function() {
    'use strict';

    // 工具函数:复制文本到剪贴板(兼容性好)
    function copyToClipboard(text) {
        if (typeof GM_setClipboard === 'function') {
            GM_setClipboard(text);
        } else if (navigator.clipboard && navigator.clipboard.writeText) {
            navigator.clipboard.writeText(text);
        } else {
            // 兼容老浏览器
            const textarea = document.createElement('textarea');
            textarea.value = text;
            document.body.appendChild(textarea);
            textarea.select();
            document.execCommand('copy');
            document.body.removeChild(textarea);
        }
    }
    // 监控并劫持“复制代码”按钮
    function hackCopyButtons() {
        const btns = document.querySelectorAll('.code-block-extension-copyCodeBtn'); 
        btns.forEach(btn => {
            // 改按钮文字
            if (btn.textContent == '自由复制' || btn.textContent == '复制成功!') return;
            btn.textContent = '自由复制';
            // 移除原有事件(防止冒泡到原生M函数)
            const newBtn = btn.cloneNode(true);
            btn.parentNode.replaceChild(newBtn, btn);
            // 重新绑定点击事件
            newBtn.addEventListener('click', function(e) {
                e.stopPropagation();
                e.preventDefault();
                let code = '';
                let codeElem = newBtn.parentElement.parentElement.parentElement.querySelector('.code-block-extension-codeShowNum');
                if (codeElem) {
                    code = codeElem.textContent || '';
                } 
                code = code.replace(/\n$/, '');
                copyToClipboard(code);
                const oldText = newBtn.textContent;
                const oldColor = newBtn.style.color;
                const oldFilter = newBtn.style.filter;
                newBtn.textContent = '复制成功!';
                newBtn.style.color = 'red';
                newBtn.style.filter = 'none';
                setTimeout(() => {
                    newBtn.textContent = oldText;
                    newBtn.style.color = oldColor;
                    newBtn.style.filter = oldFilter;
                }, 1600);
            }, false);
        });
    }

    {
    function loopHack() {
        hackCopyButtons();
        setTimeout(loopHack, 2000);
    }
    loopHack();
    }
})();