DMHY 列表优化器 - 隐藏DBD制作组

在DMHY网站上自动检测并隐藏“DBD制作组”发布的资源行,优化浏览体验。支持动态加载内容。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         DMHY 列表优化器 - 隐藏DBD制作组
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  在DMHY网站上自动检测并隐藏“DBD制作组”发布的资源行,优化浏览体验。支持动态加载内容。
// @author       Atail
// @license MIT
// @match        *://*.dmhy.org/*
// @grant        none
// @run-at       document-body
// ==/UserScript==

(function() {
    'use strict';

    // --- 配置项 ---
    const TEAM_HREF_SUFFIX = '/topics/list/team_id/805';
    const TEAM_NAME = 'DBD制作组';

    /**
     * 核心处理函数:扫描并隐藏符合条件的行
     * @param {Node} scope - 在哪个DOM节点下进行扫描,默认为整个文档
     */
    function hideMatchedRows(scope = document) {
        // 使用高效的选择器直接定位到可能包含目标链接的<a>标签
        // 这比遍历所有tr性能更好,因为它大大缩小了检查范围
        const potentialLinks = scope.querySelectorAll(`td.title span.tag a[href="${TEAM_HREF_SUFFIX}"]`);

        potentialLinks.forEach(link => {
            // 确认链接文本是否也匹配,并进行前后空格清理以增加健壮性
            if (link.textContent.trim() === TEAM_NAME) {
                // link.closest('tr') 是一个现代且高效的方法,用于查找最近的父级<tr>元素
                const rowToHide = link.closest('tr');
                if (rowToHide) {
                    // 直接设置display为none来隐藏,这是最简单直接的方式
                    rowToHide.style.display = 'none';
                    // console.log('已隐藏行:', rowToHide); // 调试时可以取消注释
                }
            }
        });
    }

    // --- 脚本主体 ---

    // 1. 针对初始页面加载:等待DOM构建完毕后,立即执行一次扫描
    // 使用 document-body 或 DOMContentLoaded 确保 #topic_list 存在
    const targetTable = document.getElementById('topic_list');
    if (targetTable) {
        // 初始执行
        hideMatchedRows(targetTable);

        // 2. 针对动态内容(如翻页、搜索等)设置观察者
        const tbody = targetTable.querySelector('tbody');
        if (tbody) {
            const observer = new MutationObserver((mutationsList) => {
                // 遍历所有发生的DOM变化
                for (const mutation of mutationsList) {
                    // 我们只关心新添加的节点(通常是新的<tr>)
                    if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                        // 对每个新增的节点(可能是tr或包含tr的片段)进行扫描
                        mutation.addedNodes.forEach(newNode => {
                            // 确保我们处理的是元素节点
                            if (newNode.nodeType === Node.ELEMENT_NODE) {
                                // 如果新节点本身就是tr,直接检查它
                                if (newNode.matches('tr')) {
                                    hideMatchedRows(newNode);
                                } else {
                                    // 否则,检查新节点内部是否包含我们关心的内容
                                    // 这能处理一次性插入多行的情况
                                    hideMatchedRows(newNode);
                                }
                            }
                        });
                        // console.log('检测到列表更新,已重新扫描。'); // 调试时可以取消注释
                        break; // 只要检测到一次内容添加就重新扫描,无需重复处理
                    }
                }
            });

            // 配置观察者:监视目标tbody的子节点变化
            const config = { childList: true };

            // 启动观察者
            observer.observe(tbody, config);

            console.log('DMHY 列表优化器已启动,正在监视列表变化...');
        }
    }
})();