彻底隐藏链接悬浮提示(终极无残留颜色修复版)

保持链接颜色不变|100%无悬浮提示|完美兼容

当前为 2025-03-25 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         彻底隐藏链接悬浮提示(终极无残留颜色修复版)
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description 保持链接颜色不变|100%无悬浮提示|完美兼容
// @author       DeepSeek Chat
// @match        *://*/*
// @grant        none
// @run-at       document-start
// @license        MIT
// ==/UserScript==

(function() {
    'use strict';

    // 存储原始链接数据
    const linkStore = new WeakMap();

    // 主处理函数
    const handleLink = (link) => {
        if (!link.href || linkStore.has(link)) return;

        // 保存原始数据
        linkStore.set(link, {
            href: link.href,
            target: link.target || '_self',
            color: window.getComputedStyle(link).color, // 保存原始颜色
            events: []
        });

        // 关键点:完全移除href属性
        link.removeAttribute('href');
        link.style.color = linkStore.get(link).color; // 强制保持原始颜色

        // 添加点击事件处理
        const clickHandler = (e) => {
            if (e.button !== 0) return; // 只处理左键点击
            e.preventDefault();
            const data = linkStore.get(link);
            if (data.target === '_blank') {
                window.open(data.href, '_blank');
            } else {
                location.href = data.href;
            }
        };

        link.addEventListener('click', clickHandler);
        linkStore.get(link).events.push(['click', clickHandler]);

        // 添加视觉样式修复
        link.style.cursor = 'pointer';
    };

    // 恢复原始链接
    const restoreLink = (link) => {
        const data = linkStore.get(link);
        if (!data) return;

        // 恢复属性
        link.href = data.href;
        if (data.target) link.target = data.target;
        link.style.color = ''; // 清除颜色强制样式

        // 移除事件监听
        data.events.forEach(([type, handler]) => {
            link.removeEventListener(type, handler);
        });

        linkStore.delete(link);
        link.style.cursor = '';
    };

    // 事件监听
    document.addEventListener('mouseover', (e) => {
        const link = e.target.closest('a');
        if (link) handleLink(link);
    }, true);

    document.addEventListener('mouseout', (e) => {
        const link = e.target.closest('a');
        if (link) restoreLink(link);
    }, true);

    // 处理初始链接
    const initLinks = () => {
        document.querySelectorAll('a[href]').forEach(handleLink);
    };

    // 动态内容监听
    const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
            mutation.addedNodes.forEach((node) => {
                if (node.nodeType === 1) {
                    if (node.matches('a[href]')) handleLink(node);
                    node.querySelectorAll('a[href]').forEach(handleLink);
                }
            });
        });
    });

    // 启动
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initLinks);
    } else {
        initLinks();
    }
    observer.observe(document.body, {
        subtree: true,
        childList: true,
        attributes: true,
        attributeFilter: ['href']
    });

})();