广告容器必须用 iframe + 显式 sandbox 属性,如 sandbox="allow-scripts allow-popups",禁用 allow-same-origin 和 allow-top-navigation;外层需预设宽高防 cls;csp 是第一道防线,须严格配置 script-src、frame-src 等;mutationobserver 应在 document.documentelement 就绪后立即启动,监听 body 的 childlist 变化并按样式特征拦截弹窗;“不再展示”需 localstorage 持久化拦截。

广告容器必须用 iframe + 显式 sandbox 属性
不写 sandbox 或只写 sandbox="",广告 iframe 会白屏且无任何错误提示,Network 面板显示 net::ERR_BLOCKED_BY_RESPONSE。浏览器直接拒收响应体,不是加载失败,是策略性拦截。
正确写法必须明确声明能力:sandbox="allow-scripts allow-popups"。严禁加 allow-same-origin(泄露 Cookie)和 allow-top-navigation(可跳转整个页面)。
- 外层容器需预设宽高,例如
style="width:300px;height:250px;",否则广告动态撑开触发 CLS(累积布局偏移) -
loading="lazy"对广告 iframe 完全无效,反而可能引发重复请求;应改用MutationObserver或IntersectionObserver动态创建 - 第三方广告脚本必须带
async,且放在开头紧贴广告位之后,绝不可塞进
服务端必须配 Content-Security-Policy 头
仅靠前端 JS 删除弹窗节点是补救,不是防御。真正起效的第一道防线在服务端:用 Content-Security-Policy 直接阻止广告脚本加载。
关键点在于 script-src 不写 'unsafe-inline' 或 'unsafe-eval',就能干掉内联广告脚本和 eval 渲染的弹窗;同时显式剔除广告常用域名(如 doubleclick.net、googlesyndication.com)。
-
frame-src和旧版child-src必须同步设置,否则广告 iframe 仍可加载 - 本地开发可用
<meta http-equiv="Content-Security-Policy">测试,但不支持report-uri等指令 - 若广告来自跨域 iframe,CSP 对其子资源无效,此时需依赖 sandbox + 外层 DOM 观察双重控制
MutationObserver 拦截弹窗节点要抢在 appendChild 前
等弹窗完全渲染再删,用户已看到闪动;真正有效的是在它被插入 DOM 的瞬间移除。重点不是监听“弹窗出现”,而是监听 document.body 的 childList 变化。
匹配逻辑不能只靠 class 名——广告常随机生成类名。更稳的方式是结合样式特征:[style*="fixed"][style*="z-index:9999"],或查找含 .banner-ad、#js-ad-layer 的祖先节点。
- observer 必须在广告脚本执行前就启动,建议注入时机为
document.documentElement准备就绪后立即执行 - 避免用
document.write或eval动态插入广告,这类行为本身就会被现代 CSP 拦截 - 不要依赖
beforeinstallprompt事件——它是 PWA 安装提示,和广告完全无关,误用只会让代码失效
“不再展示此广告”必须配合 localStorage + 渲染前拦截
点击按钮后只执行 element.remove() 或 display: none,刷新页面广告照出。因为 HTML/CSS 无状态,没有持久化机制。
真正生效的路径是:点击时记录广告 ID 到 localStorage(如 blocked_ad_id:taboola-2024),后续每次广告渲染前先查表,命中即跳过插入逻辑。
- 存储键名必须具体,避免用模糊值如
"blocked";否则多个广告类型互相覆盖 - 广告常由异步脚本加载,你的拦截逻辑如果放在
DOMContentLoaded里,可能比广告容器还早执行,查不到 DOM - Safari 无痕模式默认禁用
localStorage,需降级到sessionStorage或内存标记(仅本次会话有效)
frame-src 漏配、以及 MutationObserver 启动时机晚于广告脚本执行。这三处一错,所有前端补救都成马后炮。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











