资讯专栏INFORMATION COLUMN

列表页曝光埋点实现

miqt / 2779人阅读

摘要:列表页曝光埋点实现以商品为例要求商品一半以上出现在视窗中时上报该行的商品快速滑动过去的商品不上报滑动过程中如果一行商品一直未消失在视野中一半以上,不能重复上报滑出视野的商品,再次滑入视野时需要再次上报分析需要以下信息商品所在行的高度固定值商

列表页曝光埋点实现

</>复制代码

  1. 以商品为例
要求

商品一半以上出现在视窗中时 上报该行的商品

快速滑动过去的商品不上报

滑动过程中如果一行商品一直未消失在视野中(一半以上),不能重复上报

滑出视野的商品,再次滑入视野时需要再次上报

分析

</>复制代码

  1. 需要以下信息

  2. 商品所在行的高度rowHeight(固定值)

  3. 商品的可视区域的高度contentHeight(半固定值,不考虑浏览器的resize)

  4. 可视区域距离视窗顶部的高度headHeight(固定值)

  5. content的滚动高度(与scroll事件相关,考虑到滑动快时不触发上报,需要throttle)

实现

</>复制代码

  1. /**
  2. * 滚动事件处理
  3. * @param {number} headHeight content区域距离顶部的高度
  4. * @param {number} rowHeight 每一行的高度
  5. * @returns {Function}
  6. */
  7. export function handleScroll(headHeight, rowHeight) {
  8. let lastActive = []
  9. let deactived = []
  10. /**
  11. * @param {number} contentTop 区域的top
  12. * @return {Array} 当前活跃的的行
  13. */
  14. return function(contentTop) {
  15. let topDiff = contentTop - headHeight
  16. // 可视区域高度
  17. let visibleHeight =
  18. window.innerHeight - (topDiff <= 0 ? headHeight : contentTop)
  19. /**
  20. * 当前能显示的行数
  21. * 显露一半就需要上报 则使用四舍五入
  22. */
  23. let rowCount = Math.round(visibleHeight / rowHeight)
  24. /**
  25. * 获取当前显示的下标
  26. */
  27. let index = topDiff > 0 ? 0 : Math.round(-topDiff / rowHeight)
  28. let _active = Array.from({ length: rowCount }).reduce(
  29. (pre, cur, i) => pre.concat(index + i),
  30. []
  31. )
  32. /**
  33. * 之前上报过,未从屏幕上消失过的 不上报
  34. * 之前上报过,从屏幕中消失又出现的 上报
  35. */
  36. let active = _active.filter(
  37. v => !lastActive.includes(v) || deactived.includes(v)
  38. )
  39. /**
  40. * 收集非活跃状态的行,只收集滚上去的元素,active下面的行属于待活跃状态,由于和行的总数相关(商品的总行数知道与否不影响上报),会额外增加不必要的工作 所以此处不做考虑
  41. */
  42. deactived = Array.from({ length: index }).map((val, i) => i)
  43. /**
  44. * 上次活跃的行,用来避免重复上报
  45. */
  46. lastActive = [].concat(deactived).concat(_active)
  47. return {
  48. lastActive,
  49. active,
  50. deactived
  51. }
  52. }
  53. }
图示

使用

</>复制代码

  1. let target = document.getElementById("wrapper")
  2. let onScroll = handleScroll(100, 420)
  3. let _scroll = _.throttle(function(){
  4. let row = onScroll(target.getBoundingClientRect().y)
  5. // 此时row.active就是需要上报的行的下标,active可能为空数组
  6. ...
  7. }, 1000)
  8. target.addEventListener("scroll", _scroll)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99456.html

相关文章

  • 列表曝光埋点实现

    摘要:列表页曝光埋点实现以商品为例要求商品一半以上出现在视窗中时上报该行的商品快速滑动过去的商品不上报滑动过程中如果一行商品一直未消失在视野中一半以上,不能重复上报滑出视野的商品,再次滑入视野时需要再次上报分析需要以下信息商品所在行的高度固定值商 列表页曝光埋点实现 以商品为例 要求 商品一半以上出现在视窗中时 上报该行的商品 快速滑动过去的商品不上报 滑动过程中如果一行商品一直未消失在视...

    pf_miles 评论0 收藏0
  • 如何通过Vue自定义指令实现前端埋点详析

      获取用户的交互习惯及喜好,进一步提升转化率,可以在之前的埋点方案实现中,都是在具体的按钮或者图片被点击或者被曝光时主动通过事件去上报埋点。但这种方法适合在埋点比较少时还行的项目,遇见项目中需要大量埋点时,添加的代码就太多了,就会埋点逻辑与业务逻辑的高耦合。  由此需要换种方式。我先给大家普及下埋点上报方式都有哪些?  手动埋点  可视化埋点  无痕埋点  手动埋点,顾名思义就是纯手动写代码,调...

    3403771864 评论0 收藏0
  • 如何实现元素曝光上报

    摘要:进行数据上报的时候,经常会遇到列表数据曝光上报的问题,只对在当前可视范围内的数据内容进行曝光上报,而对于未在可视范围内的数据不进行曝光上报,等待用户滚动页面或者区域使元素出现在可视范围内时才进行曝光上报。 进行数据上报的时候,经常会遇到列表数据曝光上报的问题,只对在当前可视范围内的数据内容进行曝光上报,而对于未在可视范围内的数据不进行曝光上报,等待用户滚动页面或者区域使元素出现在可视范...

    VincentFF 评论0 收藏0
  • Android埋点系统设计

    摘要:一埋点架构设计埋点的核心逻辑抽象将生产的用户数据组织发送给服务器。普通埋点定义页面进入,页面离开,页面元素点击,页面元素曝光。无埋点进入退出都使用,如何区分增加了一个字段,用表示页面进入退出。如何修改字节码库基础使用。 一、埋点架构设计 埋点的核心逻辑抽象:将APP生产的用户数据组织发送给服务器。showImg(https://segmentfault.com/img/bVba4Lw?...

    trigkit4 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<