Greasy Fork

Greasy Fork is available in English.

[MWI]Marketplace Order Book Button Disabler

Disable and gray out buttons in MarketplacePanel_orderBook containers with dynamic content handling

当前为 2025-05-11 提交的版本,查看 最新版本

// ==UserScript==
// @name         [MWI]Marketplace Order Book Button Disabler
// @name:zh-CN   [银河奶牛]市场订单簿按钮禁用器
// @namespace    https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-orderbook-button-disabler
// @version      1.0.1
// @description  Disable and gray out buttons in MarketplacePanel_orderBook containers with dynamic content handling
// @description:zh-CN  禁用并灰化市场订单簿面板中的按钮,支持动态内容处理
// @author       shenhuanjie
// @license      MIT
// @match        https://www.milkywayidle.com/game*
// @icon         https://www.milkywayidle.com/favicon.svg
// @grant        none
// @homepage     https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-orderbook-button-disabler
// @supportURL   https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-orderbook-button-disabler
// @run-at       document-idle
// @require      https://cdn.tailwindcss.com
// ==/UserScript==

(function() {
    'use strict';

    // 配置选项
    const config = {
        containerSelector: 'div[class*="MarketplacePanel_orderBook"]',
        buttonSelector: 'button',
        logPrefix: '[OrderBookDisabler]',
        disabledClass: 'orderbook-disabled',
        clickDebounce: 100     // 点击事件防抖时间(毫秒)
    };

    // 样式定义
    const style = document.createElement('style');
    style.textContent = `
        .${config.disabledClass} {
            opacity: 0.5 !important;
            cursor: not-allowed !important;
            pointer-events: none !important;
            background-color: #e0e0e0 !important;
            color: #888 !important;
            border-color: #ccc !important;
            filter: grayscale(100%);
            transition: all 0.3s ease;
        }
    `;
    document.head.appendChild(style);

    // 日志函数
    function log(...args) {
        console.log(config.logPrefix, ...args);
    }

    // 错误处理函数
    function handleError(error) {
        console.error(config.logPrefix, 'Error:', error);
    }

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

    // 禁用按钮的函数
    function disableButton(button) {
        if (!button.classList.contains(config.disabledClass)) {
            button.disabled = true;
            button.classList.add(config.disabledClass);
            return true;
        }
        return false;
    }

    // 处理点击事件
    const handleClick = debounce(() => {
        try {
            let totalNewButtons = 0;
            
            // 查找所有符合条件的容器
            const containers = document.querySelectorAll(config.containerSelector);
            
            // 处理每个容器中的按钮
            containers.forEach(container => {
                const buttons = container.querySelectorAll(config.buttonSelector);
                buttons.forEach(button => {
                    if (disableButton(button)) {
                        totalNewButtons++;
                        log('已禁用按钮:', button.textContent.trim());
                    }
                });
            });

            if (totalNewButtons > 0) {
                log(`处理点击事件: 新增 ${totalNewButtons} 个禁用按钮`);
            }
        } catch (error) {
            handleError(error);
        }
    }, config.clickDebounce);

    // 初始化函数
    function init() {
        try {
            log('脚本已启动,正在设置点击事件监听...');

            // 初始扫描
            const startTime = performance.now();
            const initialButtons = document.querySelectorAll(`${config.containerSelector} ${config.buttonSelector}`);
            let initialCount = 0;

            initialButtons.forEach(button => {
                if (disableButton(button)) {
                    initialCount++;
                }
            });

            const endTime = performance.now();
            log(`初始扫描: 已禁用 ${initialCount} 个按钮 (耗时: ${(endTime - startTime).toFixed(2)}ms)`);

            // 设置点击事件监听
            document.addEventListener('click', handleClick);
            
            // 也监听一些可能触发内容变化的事件
            document.addEventListener('mouseup', handleClick);
            document.addEventListener('keyup', handleClick);
            
            log('已设置点击事件监听');

            // 页面加载完成后再次检查
            window.addEventListener('load', () => {
                handleClick(); // 直接调用处理函数
                log('页面加载完成,已执行按钮检查');
            });
        } catch (error) {
            handleError(error);
        }
    }

    // 启动脚本
    init();
})();