LeetCode 题目链接复制助手

在 LeetCode 题目页面添加复制题目链接的按钮

// ==UserScript==
// @name         LeetCode 题目链接复制助手
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  在 LeetCode 题目页面添加复制题目链接的按钮
// @author       Your name
// @match        https://leetcode.cn/problems/*
// @grant        GM_addStyle
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 添加按钮样式
    GM_addStyle(`
        .copy-btn {
            margin-left: 10px;
            padding: 2px;
            border: 1px solid #40a9ff;
            border-radius: 4px;
            background: #fff;
            color: #40a9ff;
            cursor: pointer;
            font-size: 14px;
            transition: all 0.3s;
            vertical-align: middle;
            line-height: 23px;
        }
        .copy-btn:hover {
            background: #40a9ff;
            color: #fff;
        }
    `);

    // 创建并插入复制按钮
    function createCopyButton(targetElement) {
        // 检查是否已经存在按钮
        if (targetElement.nextElementSibling?.classList.contains('copy-btn')) {
            return;
        }

        const copyButton = document.createElement('button');
        copyButton.textContent = '拷贝';
        copyButton.className = 'copy-btn';

        copyButton.addEventListener('click', function() {
            const link = window.location.href;
            const text = targetElement.textContent;
            const copyText = `# ${text} \n${link}`;

            navigator.clipboard.writeText(copyText).then(() => {
                // 临时改变按钮文字显示复制成功
                const originalText = copyButton.textContent;
                copyButton.textContent = '已复制!';
                setTimeout(() => {
                    copyButton.textContent = originalText;
                }, 1500);
            }).catch(err => {
                console.error('复制失败:', err);
                copyButton.textContent = '复制失败';
                setTimeout(() => {
                    copyButton.textContent = '拷贝';
                }, 1500);
            });
        });

        targetElement.parentNode.insertBefore(copyButton, targetElement.nextSibling);
    }

    // 使用 MutationObserver 监听 DOM 变化
    function observeDOM() {
        const targetNode = document.body;
        const config = { childList: true, subtree: true };

        const callback = function(mutationsList, observer) {
            for (const mutation of mutationsList) {
                if (mutation.type === 'childList') {
                    const titleDiv = document.querySelector('.text-title-large.font-semibold.text-text-primary.dark\\:text-text-primary');
                    if (titleDiv) {
                        const link = titleDiv.querySelector('a');
                        if (link) {
                            createCopyButton(link);
                            // 找到后就可以断开观察器了,因为标题只有一个
                            observer.disconnect();
                        }
                    }
                }
            }
        };

        const observer = new MutationObserver(callback);
        observer.observe(targetNode, config);
    }

    // 页面加载完成后开始观察 DOM 变化
    window.addEventListener('load', observeDOM);

    // 同时也在脚本运行时尝试添加按钮,以应对页面已加载的情况
    setTimeout(() => {
        const titleDiv = document.querySelector('.text-title-large.font-semibold.text-text-primary.dark\\:text-text-primary');
        if (titleDiv) {
            const link = titleDiv.querySelector('a');
            if (link) {
                createCopyButton(link);
            }
        }
    }, 1000);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址