// ==UserScript== // @name YouTube广告拦截器 // @namespace safe-adblock // @version 4.3 // @match *://*.youtube.com/* // @grant none // @run-at document-start // @description 优化代码,增强可维护性,无API依赖的极简高效广告拦截方案 // @downloadURL none // ==/UserScript== (function () { 'use strict'; // 广告相关的CSS选择器 const AD_SELECTORS = [ 'ytd-ad-slot-renderer', 'div.ytd-promoted-sparkles-web-renderer', '[data-ad-metadata]', 'div#player-ads.ytd-watch:not(#movie_player)', 'ytd-rich-section-renderer:has(ytd-ad-)', 'div[class*="-ad-"]:not([data-legitimate])', 'div.ytp-ad-module' ]; /** * 创建状态指示图标 */ const createStatusIcon = () => { const icon = document.createElement('div'); icon.innerHTML = ` `; icon.style.cssText = ` position: fixed; bottom: 20px; right: 20px; z-index: 9999; cursor: pointer; background: rgba(255,255,255,0.9); border-radius: 50%; padding: 6px; box-shadow: 0 2px 5px rgba(0,0,0,0.2); transition: transform 0.3s; `; // 添加点击效果 icon.addEventListener('click', () => { icon.style.transform = 'scale(0.9)'; setTimeout(() => icon.style.transform = '', 100); }); document.body.appendChild(icon); }; // 原有代码保持不变... // [保留之前的 injectStyles、playerProtector、adCleaner 等模块] // 只需要在初始化函数中添加 createStatusIcon() 调用 // 初始化所有模块 const init = () => { injectStyles(); playerProtector.init(); adCleaner.init(); createStatusIcon(); // 新增图标创建 }; // 确保DOM加载完毕后执行初始化 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();