Img前端埋点

2023-01-10  本文已影响0人  小灰灰_a

背景

对项目中统计一些用户行为、某些事件点击量、某些重要页面的曝光量等信息的统计;

统计信息

埋点方案

实现方案

项目中使用的是 img 来实现埋点数据的发送,img属于原生的HTML属性,兼容性比ajax要好很多,而且支持跨域,但如果用户禁用网页加载图片,那么将无法正常发送埋点数据。

具体代码实现

export interface IPointProps {
  buttonType?: string  // 按钮类型
  browerVersion?: string // 浏览器版本
  userInfo?: string //用户信息
  referrer?: string //来源
  currentUrl?: string // 当前url
}
// 公共类封装
class PointSDK {
    constructor() {
      // 性能分析
      this.initPerformance(); 
    }
    // 初始化性能分析
    initPerformance() {
      const url = 'xxx';
      this.send(url, performance.timing)
    }
    // 获取浏览器信息
    getBrowerVersion() {
        const navigator = window.navigator
        return {
            browerVersion: navigator.userAgent
        }
    }
    // 通过img发送埋点数据
    send(url: string, params = {} as any) {
        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;
    }
    // 自定义事件
    event(baseurl: string, value: IPointProps) {
        const api = `${baseurl}${'/api/point'}`
        const client = this.getClient()
        // 处理url中的 特殊符号,# & 等
        // const url = `${window.location.href?.replace(/#/g, '%23').replace(/&/g, '%26')}` 

        // 存在用户信息则统计,反之不需要
        value.userInfo && this.send(api, { ...client, ...value })
    }
}

const pointSDK = new PointSDK();

const Point = {
    event: (baseurl: string, value: IPointProps) => pointSDK.event(baseurl, value)
}

本文参考阿里开发者文档

上一篇下一篇

猜你喜欢

热点阅读