页面元素精确曝光与停留时间打点
场景题: “为了精细化了解用户喜好,广告部老板提出了一个极其刁钻的打点需求:在首页有一个横向的长长推荐商品卡片列表(上百个)。用户在上下滑动屏幕或者左右横滑浏览时,必须满足某一个特定的商品卡片完全出现在手机屏幕内部面积超过一半,并且用户在这个卡片上目光停驻停留超过了至少 2 秒,才算做一次'有效且真实的曝光展现(Impression)'并发送埋点上报给大数据。 这种精确的有效漏斗埋点,如果在前端实现?”
单纯地看页面大框架有没有发送 click 是非常粗暴地,我们常常需要极其细粒度的“元素视野相交感知”+“防抖精准计时漏斗池”技术。
历史包袱巨雷:scroll + 节流暴算(毁灭)
过去的前端实现极其暴力血腥,如果列表有一千个商品:
给整个 window 或者 list 绑上 onscroll 节流函数侦测,然后在一千次循环里拿出 1000 个商品卡片各自去调极为昂贵的 getBoundingClientRect() 计算它们各自的上下左右边距是不是掉进到了此刻屏幕可视窗口的算数范围边界里。
每次微小的拖拽都会带来整个浏览器世界主线程剧烈地燃烧引发卡顿。该方案对于业务来说已是被无情嘲讽唾弃的老古董(可参阅无限滚动中提到的相同缺陷)。
破局的核心兵器:IntersectionObserver(重见天曙)
现代浏览器的极致恩惠。他正是专门为了这类“两物体互相侵占甚至遮盖、进入相交”应运而生的神明接口:交叉观察器。利用大名鼎鼎的 Intersection Observer API,计算完全被浏览器在后台使用 C++ 异步且极度高效地静默接管掉,一点都不消耗卡顿前台 JS。
全局生命周期防漏网之鱼(加分秀项)
如果用户正满怀好感地凝视在一张海报上。才过了极其漫长 1.8秒 ,还没有达到你极其精通设立的 2秒 上报引爆阀值门槛。用户忽然老板来了心切惊慌地关掉了手机或者强杀了浏览器标签(Tab 强行销毁 / 用户切出)。这样极端的断绝情景由于计时器被同归于尽消灭,你岂不是错拿并流失了足足 1.8 秒的高质量行为停留时间?
如何捕捉这 1.8 秒残存漏网的数据价值?
这个时候大前端要熟知一重隐藏深度的宏事件:利用前文追踪讲过的信标神力:上兵伐谋发丧 sendBeacon 与页面临终感知回调 visibilitychange / pagehide。
在页面即将陨落时,对刚刚所保留的那个长停池(visibleTimers 字典)中尚未完全爆炸引信的那些定时器实体卡片,统系统一清算剩余已停留了的当前毫秒逝去额度时间差,借助 navigator.sendBeacon 在标签被销毁的一瞬间像流星一样极其凶猛强力且不被拦截腰斩地统一打点最后遗言,发往并喂饱数据组渴求极其苛刻的数据库。
此乃现代成熟 C 端精耕细作极致转化大厦搭建的最终技术修养与体现。

