Greasy Fork 支持简体中文。

ProcessOn 广告屏蔽器

屏蔽 ProcessOn 网站上的广告。如果觉得好用,欢迎扫码赞赏,您的支持是我持续更新的动力!

// ==UserScript==
// @name         ProcessOn 广告屏蔽器
// @namespace    http://tampermonkey.net/
// @version      0.8.1
// @description  屏蔽 ProcessOn 网站上的广告。如果觉得好用,欢迎扫码赞赏,您的支持是我持续更新的动力!
// @author       Your name
// @license      MIT
// @match        https://www.processon.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 防抖函数
    function debounce(func, wait) {
        let timeout;
        return function() {
            const context = this;
            const args = arguments;
            clearTimeout(timeout);
            timeout = setTimeout(() => func.apply(context, args), wait);
        };
    }

    // 创建样式 - 使用 CSS 隐藏大部分广告,减少 JavaScript 操作
    const style = document.createElement('style');
    style.textContent = `
        /* 广告元素 */
        div.advert,
        div[style*="background-color: rgb(176, 106, 251)"],
        .dialog-box[data-type="ad"],
        a[href*="/ac/250205"],
        .carsouselBox,
        div[class*="carsouselBox"],
        div[data-v-58b88906].carsouselBox,
        .dlg-manage,
        div[class="dlg-manage"],
        div[class*="dlg-manage"],
        .po-report,
        div[class="po-report"],
        div[class*="po-report"],
        /* 动态加载的广告容器 */
        div:has(> img[src*="pocdn.processon.com/admin/file_img"]),
        div:has(> img[src*="pocdn.processon.com/admin/popup_img"]),
        div:has(> img[src*="/image/beca4be061a.png"]) {
            display: none !important;
            opacity: 0 !important;
            visibility: hidden !important;
            pointer-events: none !important;
            height: 0 !important;
            width: 0 !important;
            position: absolute !important;
            z-index: -9999 !important;
        }
    `;
    document.head.appendChild(style);

    // 优化的广告移除函数
    const removeAds = debounce(() => {
        const adSelectors = [
            'div.advert',
            'div[style*="background-color: rgb(176, 106, 251)"]',
            '.dialog-box[data-type="ad"]',
            'a[href*="/ac/250205"]',
            '.carsouselBox',
            '.dlg-manage',
            '.po-report'
        ];

        const selector = adSelectors.join(',');
        const ads = document.querySelectorAll(selector);
        
        if (ads.length > 0) {
            ads.forEach(ad => ad.remove());
        }
    }, 100); // 100ms 的防抖时间

    // 优化的 MutationObserver
    let observerTimeout = null;
    const observer = new MutationObserver((mutations) => {
        // 批量处理多个变化
        if (observerTimeout) {
            return;
        }
        
        observerTimeout = setTimeout(() => {
            const hasRelevantChanges = mutations.some(mutation => {
                // 只处理新增节点和样式变化
                return mutation.addedNodes.length > 0 || 
                       (mutation.type === 'attributes' && 
                        (mutation.attributeName === 'style' || mutation.attributeName === 'class'));
            });

            if (hasRelevantChanges) {
                removeAds();
            }
            observerTimeout = null;
        }, 100);
    });

    // 配置 observer,减少不必要的监听
    observer.observe(document.body, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['style', 'class'],
        attributeOldValue: false,
        characterData: false,
        characterDataOldValue: false
    });

    // 初始化
    document.addEventListener('DOMContentLoaded', removeAds, { once: true });
    window.addEventListener('load', removeAds, { once: true });

    // 重写广告关闭函数
    window.getAdvert = {
        hideAdvert: removeAds
    };
})();