// ==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 // @downloadURL none // ==/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(); })();