Nodejs.cn旗下中文网广告隐藏

包含TypeScript、Tailwind、npm、Electron、pnpm、React、ESLint、Nuxt、Koa、Lodash、Fastify等常用的中文网,旗下中文网广告规则一致

// ==UserScript==
// @name         Nodejs.cn旗下中文网广告隐藏
// @description  包含TypeScript、Tailwind、npm、Electron、pnpm、React、ESLint、Nuxt、Koa、Lodash、Fastify等常用的中文网,旗下中文网广告规则一致
// @namespace
// @include      *://ts.nodejs.cn/*
// @include      *://mermaid.nodejs.cn/*
// @include      *://tailwind.nodejs.cn/*
// @include      *://vueuse.nodejs.cn/*
// @include      *://nest.nodejs.cn/*
// @include      *://moment.nodejs.cn/*
// @include      *://playwright.nodejs.cn/*
// @include      *://npm.nodejs.cn/*
// @include      *://electron.nodejs.cn/*
// @include      *://pnpm.nodejs.cn/*
// @include      *://next.nodejs.cn/*
// @include      *://unocss.nodejs.cn/*
// @include      *://chart.nodejs.cn/*
// @include      *://expo.nodejs.cn/*
// @include      *://react.nodejs.cn/*
// @include      *://pptr.nodejs.cn/*
// @include      *://eslint.nodejs.cn/*
// @include      *://xlsx.nodejs.cn/*
// @include      *://reactflow.nodejs.cn/*
// @include      *://bootstrap.nodejs.cn/*
// @include      *://ionic.nodejs.cn/*
// @include      *://marked.nodejs.cn/*
// @include      *://axios.nodejs.cn/*
// @include      *://yarn.nodejs.cn/*
// @include      *://nvm.nodejs.cn/*
// @include      *://nuxt.nodejs.cn/*
// @include      *://d3.nodejs.cn/*
// @include      *://vue-flow.nodejs.cn/*
// @include      *://quill.nodejs.cn/*
// @include      *://eslint-vue.nodejs.cn/*
// @include      *://strapi.nodejs.cn/*
// @include      *://express.nodejs.cn/*
// @include      *://less.nodejs.cn/*
// @include      *://rn.nodejs.cn/*
// @include      *://tauri.nodejs.cn/*
// @include      *://babel.nodejs.cn/*
// @include      *://day.nodejs.cn/*
// @include      *://prettier.nodejs.cn/*
// @include      *://prisma.nodejs.cn/*
// @include      *://cra.nodejs.cn/*
// @include      *://sass.nodejs.cn/*
// @include      *://socket.nodejs.cn/*
// @include      *://mongoose.nodejs.cn/*
// @include      *://pixi.nodejs.cn/*
// @include      *://husky.nodejs.cn/*
// @include      *://rx.nodejs.cn/*
// @include      *://lerna.nodejs.cn/*
// @include      *://react-navigation.nodejs.cn/*
// @include      *://stylelint.nodejs.cn/*
// @include      *://zod.nodejs.cn/*
// @include      *://koa.nodejs.cn/*
// @include      *://svelte.nodejs.cn/*
// @include      *://lodash.nodejs.cn/*
// @include      *://qrcode.nodejs.cn/*
// @include      *://sequelize.nodejs.cn/*
// @include      *://floating.nodejs.cn/*
// @include      *://astro.nodejs.cn/*
// @include      *://jest.nodejs.cn/*
// @include      *://swc.nodejs.cn/*
// @include      *://typeorm.nodejs.cn/*
// @include      *://fastify.nodejs.cn/*
// @include      *://mysql2.nodejs.cn/*
// @include      *://storybook.nodejs.cn/*
// @include      *://clipboard.nodejs.cn/*
// @include      *://sharp.nodejs.cn/*
// @include      *://postcss.nodejs.cn/*
// @include      *://graphql.nodejs.cn/*
// @include      *://cheerio.nodejs.cn/*
// @include      *://rollup.nodejs.cn/*
// @include      *://dotenv.nodejs.cn/*
// @include      *://typescript-eslint.nodejs.cn/*
// @include      *://terser.nodejs.cn/*
// @include      *://react-hook-form.nodejs.cn/*
// @include      *://vuetify.nodejs.cn/*
// @include      *://swr.nodejs.cn/*
// @include      *://animate-css.nodejs.cn/*
// @include      *://docusaurus.nodejs.cn/*
// @include      *://flow.nodejs.cn/*
// @include      *://lint-staged.nodejs.cn/*
// @include      *://knex.nodejs.cn/*
// @include      *://shadcn.nodejs.cn/*
// @include      *://trpc.nodejs.cn/*
// @include      *://faker.nodejs.cn/*
// @include      *://redux.nodejs.cn/*
// @include      *://jsdom.nodejs.cn/*
// @include      *://jsonwebtoken.nodejs.cn/*
// @include      *://ajv.nodejs.cn/*
// @include      *://styled-components.nodejs.cn/*
// @include      *://luxon.nodejs.cn/*
// @include      *://zustand.nodejs.cn/*
// @include      *://mdx.nodejs.cn/*
// @include      *://commander.nodejs.cn/*
// @include      *://assemblyscript.nodejs.cn/*
// @include      *://pino.nodejs.cn/*
// @include      *://hono.nodejs.cn/*
// @include      *://msw.nodejs.cn/*
// @include      *://winston.nodejs.cn/*
// @include      *://mocha.nodejs.cn/*
// @include      *://formik.nodejs.cn/*
// @include      *://mikro-orm.nodejs.cn/*
// @include      *://stylus.nodejs.cn/*
// @include      *://jsdoc.nodejs.cn/*
// @include      *://meteor.nodejs.cn/*
// @include      *://redis.nodejs.cn/*
// @include      *://inquirer.nodejs.cn/*
// @include      *://gulp.nodejs.cn/*
// @include      *://vue-test.nodejs.cn/*
// @include      *://mobx.nodejs.cn/*
// @include      *://biome.nodejs.cn/*
// @include      *://handlebars.nodejs.cn/*
// @include      *://htmx.nodejs.cn/*
// @include      *://hexo.nodejs.cn/*
// @include      *://zx.nodejs.cn/*
// @include      *://preact.nodejs.cn/*
// @include      *://pug.nodejs.cn/*
// @include      *://parcel.nodejs.cn/*
// @include      *://pg.nodejs.cn/*
// @include      *://chalk.nodejs.cn/*
// @include      *://cron.nodejs.cn/*
// @include      *://superagent.nodejs.cn/*
// @include      *://glob.nodejs.cn/*
// @include      *://async.nodejs.cn/*
// @include      *://xstate.nodejs.cn/*
// @include      *://react-redux.nodejs.cn/*
// @include      *://modernizr.nodejs.cn/*
// @version      0.2.0
// @author       ymzhao
// @namespace 
// @license      MIT
// @grant        GM_addStyle
// ==/UserScript==
GM_addStyle(`
    #bottomad /* 底部广告 */
    {
        display: none !important;
    }
    body:has(.fc-message-root) {
        overflow: initial !important;
    }
`);

/**
 * 需要手动清除的广告选择器列表(css优先级不够)
 * - .adsbygoogle: 全屏谷歌广告
 * - .fc-message-root: 不定时全屏弹出,强制点击观看广告
 */
const adSelectors = ['.adsbygoogle','.fc-message-root'];

/**
 * 清理广告函数
 * 遍历所有广告选择器,找到匹配的元素并隐藏它们
 */
function cleanAds() {
    adSelectors.forEach(selector => {
        document.querySelectorAll(selector).forEach(ad => {
            ad.style.setProperty('display', 'none', 'important');
        });
    });
}

/**
 * 初始化MutationObserver来监听DOM变化
 */
function watchForNewAds() {
    // 创建一个观察器实例并传入回调函数
    const observer = new MutationObserver((mutations) => {
        // 检查是否有节点被添加
        const hasAddedNodes = mutations.some(mutation => 
            mutation.addedNodes && mutation.addedNodes.length > 0
        );
        
        if (hasAddedNodes) cleanAds();
    });

    // 配置观察选项
    const config = { 
        childList: true,  // 观察子节点的添加或删除
        subtree: true     // 观察所有后代节点
    };

    // 开始观察document.body
    observer.observe(document.body, config);
}

// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', () => {
    cleanAds();
    watchForNewAds();
});

// 确保在DOM完全加载前插入的内容也能被处理
if (document.readyState === 'complete' || document.readyState === 'interactive') {
    cleanAds();
    watchForNewAds();
}

// ----------------------https://nodejs.cn/
// 获取Nodejs.cn旗下中文网匹配信息
// Array.from(document.querySelectorAll('#partner_item_box>.cate_item>a'))
//     .map(e => {
//         const host = e.href?.match(/^https?:\/\/([^/]+)\/?/i)?.[1]
//         return host && `// @include      *://${host}/*`
//     })
//     .filter(Boolean)
//     .join('\n')