当前位置: 首页 > Web前端 > HTML

列表页曝光埋点实现

时间:2023-04-02 19:14:37 HTML

列表页曝光埋点实现以产品为例。当超过一半的产品出现在窗口中时,报告该行中的产品。过去的产品没有被报道。如果一行商品在滑动过程中没有在视图中消失(过半),则不能重复。上报滑出视图的商品,再次滑入视图时,需要再次上报以下信息,供分析商品所在行的高度rowHeight(固定值)可见区域的高度productcontentHeight(半固定值,不管浏览器调整大小)可以是可视区域距离窗口顶部的高度headHeight(固定值)内容的滚动高度(与滚动事件有关,考虑到滑动快时不触发报告,需要油门)实现/***滚动事件处理*@param{number}headHeightcontent区域距顶部的高度*@param{number}rowHeight各区域的高度row*@returns{Function}*/exportfunctionhandleScroll(headHeight,rowHeight){letlastActive=[]letdeactived=[]/***@param{number}contentTop区域的最高值*@return{Array}当前活动行*/returnfunction(contentTop){lettopDiff=contentTop-headHeight//可见区域的高度letvisibleHeight=window.innerHeight-(topDiff<=0?headHeight:contentTop)/***当前可以显示的行数*如果显示一半需要报,使用四舍五入*/letrowCount=Math.round(visibleHeight/rowHeight)/***获取当前显示下标*/letindex=topDiff>0?0:Math.round(-topDiff/rowHeight)让_active=Array.from({length:rowCount}).reduce((pre,cur,i)=>pre.concat(index+i),[])/***那些之前已经报过,还没有从屏幕上消失的会未被报告*之前报告过,从屏幕上消失并再次出现*/letactive=_active.filter(v=>!lastActive.includes(v)||deactived.includes(v))/***收集非活动行,只收集汇总的元素,active下面的行属于active状态,因为它和总行数有关(不知道产品总行数不影响上报),它会增加不必要的工作,所以这里不考虑*/deactived=Array.from({length:index}).map((val,i)=>i)/***上次激活的行,到避免重复报告*/lastActive=[].concat(deactived).concat(_active)return{lastActive,active,deactived}}}iconuselettarget=document.getElementById('wrapper')letonScroll=handleScroll(100,420)让_scroll=_.throttle(function(){letrow=onScroll(target.getBoundingClientRect().y)//此时row.active是需要上报的行的下标,active可能是一个空数组...},1000)target.addEventListener('滚动',_scroll)