真正有效的批量净化需结合DOM监听+特征匹配+安全移除三步:用MutationObserver监听动态广告节点,优先用node.matches()匹配CSS选择器,移除前校验document.body.contains(node),并处理script/style内联代码、Shadow DOM及跨域iframe广告。

直接删广告代码不靠谱,多数广告是动态插入的,静态删完刷新就回来;真正有效的批量净化,得结合 DOM 监听 + 特征匹配 + 安全移除三步走。
用 MutationObserver 持续监听并清除新增广告节点
广告脚本常在页面加载后异步注入,MutationObserver 是唯一能稳定捕获这类动态节点的方式。它比轮询高效,也比 DOMContentLoaded 更早介入。
- 只观察
childList和subtree: true,避免监听属性变更带来的噪音 - 过滤目标节点时,优先用
node.matches()判断 class/id,比正则更安全(例如:node.matches('[class*="ad"], [id*="popup"]')) - 移除前加一层检查:排除
document.body.contains(node),防止误删已 detached 的节点 - 不要用
observer.disconnect()中断监听——广告可能分多批注入,断了就漏掉
识别广告节点的可靠 CSS 选择器模式
靠 class 名关键词(如 ad、banner、float)容易误伤,得叠加布局和语义特征才稳。
- 高概率广告容器:
[class*="ad"]:not([class*="header-ad"]):not([class*="ad-free"]), [id*="advert"]:not(#advertise-link) - 悬浮浮层类:
div[style*="position: fixed"][style*="z-index"][style*="top: 0"](注意:必须带top: 0或bottom: 0,否则会误杀导航栏) - iframe 广告:
iframe[src*="taboola.com"], iframe[src*="revcontent.com"], iframe[src*="outbrain.com"] - 慎用通配:
[class^="ad-"], [class$="-ad"]在某些 CMS 模板里会命中合法模块,先全局搜索确认无 JS 引用再启用
清理 script/style 标签里的广告逻辑代码
有些广告不是 DOM 节点,而是内联 <script></script> 或 <style></style> 注入行为,比如自动弹窗、右下角浮动按钮,光删 DOM 不解决根本问题。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
立即学习“前端免费学习笔记(深入)”;
- 遍历所有
document.querySelectorAll('script, style'),对textContent做关键词扫描(如/showPopup|\.adBanner|floatAd/i),匹配后调用node.remove() - 不建议用正则删整个标签块——
<script>console.log("debug");</script>这类调试代码也会被误杀 - 对
src外链脚本,用node.src匹配域名更准(如taboola.com、monetate.net),比内容扫描快且无副作用 -
<style></style>里含.ad-banner{display:flex}这种规则,删掉后对应 DOM 可能仍存在但不可见,属于“视觉净化”,可选做
油猴脚本集成时的执行时机与沙箱风险
在 Tampermonkey 里跑 DOM 清理脚本,@run-at 设成 document-idle 不够——广告脚本常在 setTimeout 或 requestIdleCallback 里延迟执行,得主动等。
- 推荐组合:
@run-at document-start+setTimeout(() => initCleaner(), 200)+ 启动MutationObserver,覆盖大部分广告注入窗口 - 油猴默认启用了沙箱,
document.querySelector能用,但node.isConnected在旧版 Chrome 可能返回undefined,改用document.body.contains(node)更兼容 - 如果页面用了 Shadow DOM(如某些 Web Component 封装的广告),
MutationObserver默认监听不到,需手动遍历shadowRoot并递归监听 - 别在脚本里写
location.reload()强刷——用户正在填表单或上传文件时会丢数据,净化失败应仅 log 到控制台
最易被忽略的是跨域 iframe 和 Shadow DOM 内部的广告,它们不在主文档 DOM 树里,querySelectorAll 查不到,MutationObserver 也监听不到,必须单独处理;还有那些用 innerHTML += 动态拼接的广告,特征字符串藏在 JS 字符串里,靠 DOM 特征匹配完全失效,只能靠网络请求拦截或 CSP 策略压制。


















