Greasy Fork

来自缓存

Greasy Fork is available in English.

万能复制插件(优化版)

仅点击设置 data-copy 属性的元素时复制其内容,更安全、兼容性强、体验更好。

当前为 2025-07-10 提交的版本,查看 最新版本

// ==UserScript==
// @name         万能复制插件(优化版)
// @namespace    http://tampermonkey.net/
// @version      1.6.1
// @description  仅点击设置 data-copy 属性的元素时复制其内容,更安全、兼容性强、体验更好。
// @author       You
// @match        *://*/*
// @grant        GM_setClipboard
// ==/UserScript==

(function () {
    'use strict';

    // 显示自定义复制成功提示
    function showTip(msg) {
        const tip = document.createElement('div');
        tip.innerText = msg;
        tip.style.cssText = `
            position: fixed;
            top: 20px;
            right: 20px;
            background: #4CAF50;
            color: white;
            padding: 10px 15px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0,0,0,0.2);
            z-index: 9999;
            font-size: 14px;
        `;
        document.body.appendChild(tip);
        setTimeout(() => tip.remove(), 2000);
    }

    // 复制文本
    function copyText(text) {
        if (!text.trim()) return;
        if (navigator.clipboard) {
            navigator.clipboard.writeText(text).then(() => {
                showTip('已复制: ' + text);
            }).catch(() => {
                GM_setClipboard(text);
                showTip('已复制: ' + text);
            });
        } else {
            GM_setClipboard(text);
            showTip('已复制: ' + text);
        }
    }

    // 从元素中提取文本
    function extractText(el) {
        const tag = el.tagName.toLowerCase();
        if (tag === 'input' || tag === 'textarea') return el.value;
        return el.innerText || el.textContent || '';
    }

    // 点击监听(仅对 data-copy 元素生效)
    document.addEventListener('click', (e) => {
        let el = e.target;
        // 向上查找具有 data-copy 的祖先元素
        while (el && el !== document.body) {
            if (el.hasAttribute('data-copy')) {
                const text = extractText(el);
                copyText(text);
                break;
            }
            el = el.parentElement;
        }
    });
})();