• vue中列表实现漏出即曝光


    场景:滚动翻页的列表中的数据滚动到可视区域内立即曝光埋点

    实现思路:给需要曝光的元素添加指定属性,监听滚动停止时获取含有该指定属性的元素,如果在可视区域内就上报,已上报过的不再重复上报

    详细实现过程见代码

    1、列表中的元素添加指定属性,属性值为上报埋点搜索需要的参数

    1. class="templist-item" v-for="(item, index) in datalist" :key="index"
  • :data-exposure="`{
  • eventName: 'order_exposure',
  • nsid: '${item.nsid}',
  • productId:'${item.id}',
  • sdata: '${item.sdata||''}',
  • commonName: '${item.showName}',
  • position: '${index}',
  • }`"
  • >
  • 某某列表项

2、曝光埋点实现方法

  1. // 漏出曝光埋点
  2. exposureView(){
  3. let eles = document.querySelectorAll("[data-exposure]");
  4. eles = [...eles];
  5. eles.forEach((item) => {
  6. const attrs = item.getAttribute('data-exposure');
  7. if (attrs) {
  8. // hasTrack-是否已上报
  9. const hasTrack = item.getAttribute('hasTrack');
  10. if (this.isElementInViewport(item)) {
  11. // 在可见区域内没有上报的才会上报
  12. if (hasTrack === 'false' || !hasTrack) {
  13. const child = eval("("+attrs+")");
  14. if (child.eventName == 'order_exposure') {
  15. // 这里是调用的封装的埋点方法,各位看自己项目如何上报
  16. actionTracking(child.eventName, {
  17. nsid: child.nsid,
  18. productId: child.productId,
  19. sdata: child.sdata || '',
  20. position: child.position || null,
  21. cate_position: child.cate_position || -1,
  22. cate_text: child.cate_text || '',
  23. })
  24. }
  25. item.setAttribute('hasTrack', true);
  26. // item.removeAttribute('data-exposure');
  27. }
  28. } else {
  29. item.setAttribute('hasTrack', false);
  30. }
  31. }
  32. })
  33. },
  34. // 判断是否在可视区域内
  35. isElementInViewport(el) {
  36. var rect = el.getBoundingClientRect();
  37. var width_st = rect.width,
  38. height_st = rect.height;
  39. var innerHeight = window.innerHeight,
  40. innerWidth = window.innerWidth;
  41. if ( rect.top <=0 && rect.height > innerHeight
  42. || rect.left <= 0 && rect.width > innerWidth
  43. ) {
  44. return rect.left * rect.right <= 0
  45. || rect.top * rect.bottom <= 0
  46. }
  47. return (
  48. rect.height > 0
  49. && rect.width > 0
  50. && ( ( rect.top >= 0 && rect.top <= innerHeight - height_st )
  51. || ( rect.bottom >= height_st && rect.bottom <= innerHeight ) )
  52. && ( ( rect.left >= 0 && rect.left <= innerWidth - width_st )
  53. || ( rect.right >= width_st && rect.right <= innerWidth ) )
  54. );
  55. },

3、在页面监听滚动的地方调用exposureView方法即可,注意:因为是滚动时调用,会导致首屏没有默认上报,在mounted生命周期中调用一下就可以。

  • 相关阅读:
    devops完整搭建教程(gitlab、jenkins、harbor、docker)
    亲手将TP-LINK路由器改装成交换机使用
    研发过程中的文档管理与工具
    算法之跳表
    1.1 Metasploit 工具简介
    微信小程序:喝酒娱乐小游戏助力神器
    微服务平滑迁移上云最佳实践
    AC自动机
    ESP32网络开发实例-将 ESP32 连接到 EMQX Cloud MQTT Broker
    springboot出现意外情况
  • 原文地址:https://blog.csdn.net/weixin_41719836/article/details/134407152