文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript利用img实现前端页面埋点功能

2024-04-02 19:55

关注

做数据分析的时候,可能会遇到一个问题:如何获取足量的有效数据。简单记录用户登录IP肯定是不能满足要求的,这个时候就需要我们在前端页面埋点,也就是数据采集点。如何来实现一个前端埋点功能,本文就带你上手试试。

数据类型

首先,我们需要明确埋点需要哪些数据,这个和具体的业务需求有关。但是我们设计的时候,还是应该尽量考虑:

埋点数据范围清晰了,那么怎么来实现埋点呢?

技术方案

首先我们不建议使用ajax发送http的方式将埋点数据发送到服务端,原因主要有两个:

其他原因也有,但不是主要的。这里,我们建议使用<img>或者<script>来实现埋点数据的发送,这两个属于原生的HTML属性,兼容性比ajax要好很多,而且支持跨域。img和script如果要细分的话,还是有差异的,感兴趣的朋友可以移步:详解JavaScript发送埋点请求的两种方式,本文将选择img来实现埋点。

如何设计

在写代码前,可以先设计出代码大概的结构,这样在写的时候才会思路清晰。在埋点数据中,性能分析和错误监听可能会复杂一点。性能分析可以使用performance.timing

performance的每一个属性的作用节点可参考下图:

错误监听可参考文章:如何监听Vue项目报错的4种方式 

完整代码

    class StatisticsSDK {
    constructor() {
      this.initPerformance(); // 性能分析
      this.initError(); // 错误监听
    }
    // 初始化性能分析
    initPerformance() {
      const url = 'xxx';
      this.send(url, performance.timing)
    }

    // 初始化错误监听
    initError() { 
      window.addEventListener('error', event => { 
        const {error, lineno, colno} = event;
        this.error(error, {lineno, colno})
      })
      // Promise 未catch的错误
      window.addEventListener('unhandledrejection', event => {
        this.error(new Error(event.reason), {type: 'unhandledrejection'})
      })
    }

    // 发送埋点数据,作为公共方法被调用
    send(url, params = {}) {
      params.id = Date.now(); // 当前时间戳
      const arr = [];
      for (let key in params) {
        arr.push(`${key}=${params[key]}`);
      }
      const newUrl = `${url}?${arr.join('&')}`; // 参数拼接在请求地址上
      // 使用img发送埋点数据
      // const img = new Image();
      // img.src = newUrl;
      const img = document.createElement('img');
      img.src = newUrl;
    }

    // 页面访问量
    pv() {
      const url = 'xxxx'
      // 调用send发送
      this.send(url, {key: 'pv', value: location.href})
    }

    // 自定义事件
    event(key, value) {
      const url = 'xxxx'; // 服务端地址
      // 调用send发送
      this.send(url, {key, value})
    }

    // 未捕获的错误,或者用户自行发送错误埋点数据时
    error(error, info = {}) {
      const url = 'xxx';
      const {message, stack} = error;
      this.send(url, {message, stack, ...info})
    }
  }
  const s = new StatisticsSDK();

总结

本文主要使用img来实现埋点数据的发送,考虑了跨域、兼容性,但是也存在比较大的缺陷:如果用户禁用网页加载图片,那么将无法正常发送埋点数据。这种情况下,可以使用script实现本案例,两者的差异可以参考详解JavaScript发送埋点请求的两种方式,可以使用script实现本案例。

到此这篇关于JavaScript利用img实现前端页面埋点功能的文章就介绍到这了,更多相关JavaScript埋点功能内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯