找回密码
 立即注册
首页 业界区 业界 Tampermonkey脚本开发入门:以NGA横幅移除为例 ...

Tampermonkey脚本开发入门:以NGA横幅移除为例

杆树 前天 19:23
序:
已经有10来年没写过代码和研究技术了,转职产品岗了,工作闲时会看一看NGA,但是NGA的横幅很明显,,所以想到用Tampermonkey来注入代码把横幅给删掉(让DeepSeek 帮忙写了一些)。
一、开发环境准备


  • 浏览器扩展安装

    • Chrome:访问Tampermonkey官网安装

  • 开发工具启用
    javascript复制代码
    1. // 调试快捷键
    2. Ctrl+Shift+I  // 打开开发者工具
    3. Ctrl+Shift+M  // 切换移动端模式
    复制代码
二、脚本元信息解析

javascript复制代码
  1. // ==UserScript==
  2. // @name         NGA自定义横幅移除  // 脚本显示名称
  3. // @namespace    http://tampermonkey.net/  // 防止冲突的命名空间
  4. // @version      1.3  // 语义化版本号
  5. // @description  完全移除#custombg容器  // 应用商店展示描述
  6. // @match        *://nga.178.com/*  // 生效站点(支持通配符)
  7. // @grant        none  // 权限声明
  8. // ==/UserScript==
复制代码
最佳实践建议:

  • 始终声明@namespace避免脚本冲突
  • 使用@match替代@include获得更精准的URL控制
三、核心功能实现

1. DOM元素定点清除

javascript复制代码
  1. const nukeCustomBg = () => {
  2.     // 精确选择器定位
  3.     const target = document.getElementById('custombg');
  4.    
  5.     // 防御性编程检查
  6.     if (target && target.parentNode) {
  7.         target.remove();
  8.         console.log('[脚本日志] 已移除自定义横幅容器');
  9.     }
  10. };
复制代码
2. 动态内容监听

javascript复制代码
  1. // 创建观察者实例
  2. const observer = new MutationObserver(mutations => {
  3.     mutations.forEach(mutation => {
  4.         if (mutation.addedNodes.length) {
  5.             debouncedNuke();
  6.         }
  7.     });
  8. });
  9. // 配置监听参数
  10. observer.observe(document, {
  11.     childList: true,   // 监控子节点变化
  12.     subtree: true      // 监控所有后代节点
  13. });
复制代码
3. 单页应用兼容方案

javascript复制代码
  1. // 劫持History API
  2. const _pushState = history.pushState;
  3. history.pushState = function() {
  4.     _pushState.apply(this, arguments);
  5.     setTimeout(nukeCustomBg, 50); // 等待路由更新完成
  6. };
  7. // 监听hashchange事件
  8. window.addEventListener('hashchange', () => {
  9.     setTimeout(nukeCustomBg, 100);
  10. });
复制代码
四、性能优化技巧

1. 函数节流控制

javascript复制代码
  1. function debounce(fn, delay) {
  2.     let timer;
  3.     return function() {
  4.         clearTimeout(timer);  // 清除旧计时器
  5.         timer = setTimeout(() => {
  6.             fn.apply(this, arguments);
  7.         }, delay);
  8.     };
  9. }
  10. // 创建防抖实例(300ms阈值)
  11. const debouncedNuke = debounce(nukeCustomBg, 300);
复制代码
2. 资源释放策略

javascript复制代码
  1. // 适时断开观察者
  2. window.addEventListener('beforeunload', () => {
  3.     observer.disconnect();
  4. });
复制代码
五、脚本调试指南

控制台调试命令

javascript复制代码
  1. // 手动触发移除
  2. unsafeWindow.nukeCustomBg();
  3. // 查看观察者状态
  4. console.log(observer._callback);
  5. // 性能指标统计
  6. console.time('移除操作');
  7. target.remove();
  8. console.timeEnd('移除操作');  // 典型值:0.15-0.3ms
复制代码
 

完整代码

完整代码
  1.  // ==UserScript==
  2. // @name         NGA自定义横幅移除
  3. // @namespace    http://tampermonkey.net/
  4. // @version      1.3
  5. // @description 完全移除#custombg容器
  6. // @match        *://nga.178.com/*
  7. // @grant        none
  8. // ==/UserScript==
  9. (function() {
  10.     'use strict';
  11.     // 核心删除函数
  12.     const nukeCustomBg = () => {
  13.         const target = document.getElementById('custombg');
  14.         if (target) {
  15.             target.remove();
  16.             console.log('已移除自定义横幅容器');
  17.         }
  18.     };
  19.     // 即时执行 + 防抖监听
  20.     const debouncedNuke = debounce(nukeCustomBg, 300);
  21.     // 启动监控
  22.     const observer = new MutationObserver(debouncedNuke);
  23.     observer.observe(document, {
  24.         childList: true,
  25.         subtree: true
  26.     });
  27.     // 初始执行
  28.     nukeCustomBg();
  29.     // 防抖函数
  30.     function debounce(fn, delay) {
  31.         let timer;
  32.         return function() {
  33.             clearTimeout(timer);
  34.             timer = setTimeout(() => fn.apply(this, arguments), delay);
  35.         };
  36.     }
  37.     // 兼容HTML5 History API
  38.     const _pushState = history.pushState;
  39.     history.pushState = function() {
  40.         _pushState.apply(this, arguments);
  41.         setTimeout(nukeCustomBg, 50);
  42.     };
  43. })();
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册