localStorage可通过存储时间戳实现广告展示间隔控制,每次展示时记录时间,下次展示前计算与上次间隔是否超阈值(如24小时),需在广告渲染逻辑最前端读写,注意同源限制及毫秒差值计算避免误判。

用 localStorage + 时间戳限制广告展示间隔
广告刷得太频繁,用户直接划走——这不是体验问题,是技术没控住。核心思路是:每次展示广告时记录时间戳,下次展示前检查距上次是否超过设定阈值(比如 24 小时)。HTML 本身不提供计时能力,必须靠 JS 配合 localStorage 持久存状态。
-
localStorage存的是字符串,记得用JSON.stringify()和JSON.parse()处理对象 - 别用
Date.now()直接比大小,要算差值再除以1000 * 60 * 60 * 24得天数,避免毫秒溢出误判 - 跨页面生效的关键:读取和写入必须在广告渲染逻辑最前端,不能等
IntersectionObserver触发后再判断 - 注意同源限制——子域名不同(如
ad.example.comvswww.example.com)无法共享localStorage
广告 SDK 自带频率控制怎么配(以 Google Ad Manager 为例)
第三方广告平台通常内置频控,但默认关闭或设得很宽。不手动调,等于没开。GAM 中真正起作用的是 googletag.pubads().setTargeting("frequency", "once_per_day") 这类 targeting 参数,不是界面上的“投放设置”。
- 必须在
googletag.enableServices()之前调用setTargeting(),否则无效 -
"once_per_session"和"once_per_day"是常用值,后者依赖浏览器localStorage,前者只记内存 - 多个广告位共用同一频控 key 时,它们会互相抑制;想独立控制,得用不同 key,比如
"freq_home"、"freq_article" - 服务端频控(如 GAM 的 “Frequency capping” 设置)优先级高于客户端,但需要广告请求带用户标识(如
idfa或gpp),普通网页常因隐私策略拿不到
为什么 cookie 控制在现代浏览器里基本失效
第三方 Cookie 已被 Chrome、Safari、Firefox 全面限制,默认不发送。你写的 document.cookie = "ad_shown=1; expires=...;" 在跨域广告 iframe 里根本进不去主站上下文,更别说同步到其他页面。
- 第一方 Cookie 可用,但仅限同域名广告(比如你自己托管的 banner 图片),对主流广告联盟无效
-
SameSite=Lax是当前默认行为,SameSite=Strict会让广告请求直接丢掉 cookie - 别试
document.domain降域——现代浏览器已废弃该 API,且对跨源 iframe 无意义 - 替代方案只有两个:
localStorage(同源)或服务端下发频控 token(需后端配合)
用户手动点击“不再展示”后怎么防止广告复活
只做 display: none 或 remove(),关掉页面再打开,广告照出。真生效必须在广告容器插入 DOM 前就拦截。
立即学习“前端免费学习笔记(深入)”;
- 给每个广告位加唯一
data-ad-id="banner-top",点击“不再展示”时把该 ID 推入localStorage数组 - 广告加载入口函数(比如
renderAdSlot())开头就查localStorage.getItem("ad_blocked_list"),命中则直接 return - 注意 MutationObserver 不可靠——它监听的是 DOM 变化,而广告 SDK 常用
document.write()或iframe.srcdoc绕过 - 最稳的方式:所有广告位都由统一 JS 函数初始化,且该函数强制校验屏蔽列表,不给任何“漏网”机会
实际中最容易被忽略的是频控粒度。按用户设备控(localStorage)和按登录态控(服务端 token)效果完全不同——前者换浏览器就失效,后者需要鉴权体系支撑。选哪种,取决于你的广告计费模型和用户识别能力。



















