需结合持续可见时间、可见比例阈值、防作弊逻辑和时间精度控制来监测广告位真实曝光有效时长;利用IntersectionObserver触发,配合performance.now()时间戳与状态机管理,设定0.5可见阈值及1秒最小时长,排除快闪、切页、遮挡等作弊场景,并通过sendBeacon采样上报。

要监测广告位的真实曝光有效时长,不能只靠“是否进入视口”这一瞬时状态,而需结合持续可见时间、可见比例阈值、防作弊逻辑和时间精度控制。IntersectionObserver 本身不提供计时能力,但可作为触发器,配合时间戳记录与状态机管理,实现高可信度的有效曝光时长统计。
设定合理的可见性判定阈值
浏览器默认的 intersectionRatio 是浮点数(0–1),代表目标元素在视口内可见面积占比。广告有效曝光通常要求至少 50% 面积连续可见 ≥1 秒。建议:
- 将
threshold设为[0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0],便于精细判断进入/退出关键比例点 - 仅当
entry.intersectionRatio >= 0.5且entry.isIntersecting === true时,才视为“开始有效可见” - 一旦
intersectionRatio低于 0.5 或isIntersecting变为false,立即暂停计时
用时间戳+状态机管理曝光周期
避免依赖 setInterval 或 setTimeout 累加,而是用高精度时间戳(performance.now())记录起止点:
- 首次满足可见条件时,记录
startTime = performance.now(),并设isCounting = true - 每次回调中若仍满足条件,更新
lastValidTime = performance.now() - 退出有效可见状态时,计算差值:
duration = lastValidTime - startTime,仅当duration >= 1000(1秒)才上报为一次有效曝光 - 重入视口时需重置状态,防止跨会话累计
过滤无效或作弊场景
真实业务中需排除滚动快闪、页面隐藏、iframe遮挡等干扰:
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
- 检查
document.visibilityState !== 'visible'时暂停计时(标签页切走) - 监听
pagehide/visibilitychange事件,及时终止未完成的计时 - 对同一广告位 5 秒内重复触发的“进入-退出-再进入”,合并为单次连续曝光,避免刷量
- 若元素被
transform: scale(0)、opacity: 0或父级overflow: hidden截断,intersectionRatio可能失真,建议辅以getBoundingClientRect()校验实际渲染尺寸
上报与采样控制
高频上报影响性能,也增加服务端压力:
- 仅对满足“≥1秒+≥50%可见”的曝光才触发上报,失败或超短曝光不发请求
- 使用
sendBeacon()发送,确保页面卸载前也能送达 - 对高流量广告位启用采样,例如
Math.random() 再上报,平衡数据精度与资源消耗 - 上报字段至少包含:广告ID、曝光起止时间戳、最大连续可见时长、平均可见比、触发设备类型
不复杂但容易忽略的是状态清理和边界判断——比如用户快速滚动导致同一广告反复进出临界点,或页面缩放后 intersectionRatio 计算偏移。把这些细节补上,曝光时长数据才真正可归因、可优化。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










