前端埋点方式

news2025/1/21 16:42:51

前言:
想要了解用户在系统中所做的操作,从而得出用户在本系统中最常用的模块、在系统中停留的时间。对于了解用户的行为、分析用户的需求有很大的帮助,想实现这种需求可以通过前端埋点的方式。
埋点方式:
1.什么是埋点?
“埋点”是一种在应用程序或网站中插入代码的方式,用于收集用户行为或特定事件(点击事件、浏览时间、搜索事件等)的信息。它是用于分析和监控用户行为、应用性能和其他指标的一种方法。
2.埋点的目的
为了收集关键的数据和指标,以便帮助了解用户的行为、改进用户的体验、·优化应用性能、支持业务决策
3.埋点收集的数据类型
(1)用户行为类型:例如:页面浏览量、点击事件、表单提交、购买行为等
(2)应用性能数据:例如:页面加载时间、API调用延迟、错误日志等
(3)设备和环境数据:例如:用户设备类型、操作系统、浏览器版本等
(4)用户属性数据:例如:用户ID、地理位置、用户角色等
4.常见的埋点方式
(1)手动埋点:开发人员在代码中显示的插入埋点代码,通常使用Javascript或其他编程语言实现。(比较常用的方法)
(2)自动埋点:使用自动化工具或框架,自动收集 某些标准事件或用户行为数据
(3)可视化埋点:使用可视化工具,在页面上直接选择元素或交互,并配置要捕获的事件
5.常用埋点方法实例
(1)基于ajax的埋点上报
因为埋点实际上是对关键节点的数据进行上报和服务端交互的一个过程,所以我们可以和后端约定一个接口通过ajax进行数据上报。

代码如下:

function buryingPointAjax(data) {
	return new Promise((resolve, reject) => {
		// 创建ajax请求
		const xhr = new XMLHttpRequest()
		// 定义请求接口
		xhr.open("post", '/buryingPoint', true)
		// 发送数据
		xhr.send(data)
	})
}

// 使用
let info = {}
buryingPointAjax(info) // 这样就成功上报了info的对象

缺点:
一般而言,埋点域名并不是当前域名,因此请求会存在跨域风险,且如何ajax配置不正确可能会被浏览器拦截。因此使用ajax请求并不是万全之策

(2)基于img的埋点上报
数据上报前端主要是负责将数据传递到后端,并不过分强调前后端交互,因此可以通过一些支持跨域的标签去实现数据上报功能。script、link、img就是我们上报的数据最好对象,推荐使用img标签去实现。如果需要请求script和link,我们需要将标签挂载到页面上,会反复操作dom造成页面性能受影响,而且载入js/css资源还会阻塞页面渲染,影响用户体验,所以选择使用script和link进行埋点的话要慎重考虑。而img标签并不需要挂载到页面上,基于js去new image(),设置src后就可以直接请求图片。

代码如下:

// 控制台创建一个image标签
var img = new image()
img.src="https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/img/MaskGroup.13dfc4f1.png"

可以看到即使未被挂载到页面上依旧发起了请求
在这里插入图片描述

// 创建script标签
let a = document.createElement('script')
a.src = 'https://lf-headquarters-speed.yhgfb-cn-static.com/obj/rc-client-security/web/stable/1.0.0.28/bdms.js'

创建一个script标签,未挂载到页面上,并不会发起请求
在这里插入图片描述

// 将标签挂载到页面上
document.body.appendChild(a)

这个时候就可以看到发起请求了
在这里插入图片描述
(3)基于Navigator.sendBeacon的埋点上报
Navigator.sendBeacon是目前通用的埋点上报方案。Navigator.sendBeacon方法接受两个参数,第一个参数是目标服务器的URL,第二个参数是所要发送的数据(可选),可以是任意类型(字符串、表单对象、二进制对象等等)。
navigator.sendBeacon()方法可用于通过HTTP POST将少量数据异步传输到Web服务器。它主要用于将统计数据发送到Web服务器,同时避免了用传统技术(XMLHttpRequest)发送分析数据的一些问题。

注:sendBeacon如果成功进入浏览器的发送队列后,会返回true;如果受到队列总数、数据大小的限制后,会返回false。返回ture后,只是表示进入了发送队列,浏览器会尽力保证发送成功,但是否成功,不会再有任何返回值。

例子:
在这里插入图片描述
发送了一个post请求,将小量的数据发送到服务端,用于统计数据
在这里插入图片描述
相较于img标签,使用navigator.sendBeacon会更规范,数据传输上可传输资源类型会更多。
对于ajax在页面卸载时上报,ajax有可能没上报完,页面就卸载了导致请求中断,因此ajax处理这种情况时必须作为同步操作。
sendBeacon是异步的,不会影响当前页到下一个页面的跳转速度,且不受同域限制。这个方法还是异步发出请求,但是请求和当前页面脱离关联,作为浏览器的任务,因此可以保证会把数据发出去,不拖延卸载流程。

结论
1.img兼容性好
2.无需挂载到页面上,反复操作DOM
3.img的加载不会阻塞html的解析,但img加载后并不渲染,它需要等待Render Tree生成完之后才和Render Tree一起渲染出来
4.通常埋点上报会使用gif图,合法的GIF只需要43字节
5.不推荐ajax
6.考虑兼容性的话,img是不二之选
7.最适合的方案是Navigator.sendBeacon

6.常见的埋点行为

点击触发埋点

// 绑定点击事假,当点击目标元素时,触发埋点上报
function clickButton(url, data) {
	navigator.sendBeacon(url, data)
}

页面停留时间上报埋点

// 路由文件中,初始化一个startTime,当页面离开时通过路由守卫计算停留时间
let url = ''// 上报地址
let startTime = Date.now()
let currentTime = ''
router.beforeEach((to, from, next) => { 
     if (to) {
         currentTime = Date.now()
         stayTime = parseInt(currentTime - startTime)
         navigator.sendBeacon(url, {time: stayTime})
         startTime = Date.now()
     }
 })

错误监听埋点

// 通过监听函数去接收错误信息
// vue错误捕获
app.config.errorHandler = (err) => {
navigator.sendBeacon(url, {error: error.message, text:'vue运行异常'})

// JS异常与静态资源加载异常
window.addEventListener('error', (error) => {
	if(error.message) {
		navigator.sendBeacon(url, {error: error.message, text:'js执行异常'})
	} else {
		navigator.sendBeacon(url, {error: error.filename, text: '资源加载异常'})
	}
})

// 请求错误捕获
axios.interceptors.response.use(
	(response) => {
		if(response.code === 200) {
			return Pormise.resolve(response)
		} else {
			return Promise.reject(response)
		}
	},
	(error) => {
		// 返回错误逻辑
		navigator.sendBeacon(url, {error: error, text: '请求错误异常'})
	}
)

内容可见埋点

// 通过交叉观察器去监听当前元素是否出现在页面

// 可见性发生变化后的回调
function callback(data) {
	navigator.sendBeacon(url, {target: data[0].target, text: '内容可见'})
}
// 交叉观察器配置项
let options = {}
// 生成交叉观察器
const observer = new IntersectionObserver(callback)
// 获取目标节点
let target = document.getElementById("target")
// 监听目标元素
observer.observe(target)

其他更详细埋点内容可参考:https://mp.weixin.qq.com/s/lQos8C9y_6-ZT886k3aR9g

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Selenium+python】自动化测试登录界面

前言:已经学习selenium许久了,奈何公司的项目还在码代码中...,感觉自己学的东西快忘的差不多了,所以就找个网站练练手,顺便回顾一下UI自动化的知识,也希望跟我一样的小白有所受益。 一、用例分析&#xff…

线扫相机DALSA--常见问题四:修改相机参数,参数保存无效情况

该问题是操作不当,未按照正常步骤保存参数所致,相机为RAM机制,参数需保存在采集卡的ROM内。 保存参数步骤: ①首先将相机参数保存至User Set1; ②然后回到Board(采集卡)参数设置区,鼠标选中Basic Timing&a…

C++——类和对象(中)完结

赋值运算符重载 运算符重载 C 为了增强代码的可读性引入了运算符重载 , 运算符重载是具有特殊函数名的函数 ,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为:关键…

中富转债,章鼓转债上市价格预测

中富转债-123226 基本信息 转债名称:中富转债,评级:AA-,发行规模:5.2亿元。 正股名称:中富电路,今日收盘价:30.03元,转股价格:36.44元。 当前转股价值 转债面…

桥接模式birdge

简介 桥接模式:将抽象与实现相分离,使他们可以独立变化。 角色 抽象化(Abstraction)角色: 该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现,抽象角色一般为抽象类&#xf…

NOA标配搭载率不足3%!英伟达中国「自研」智驾方案

汽车行业的特殊性,意味着,对于供应链来说,一家独大几乎不可能。对于芯片赛道来说,同样如此。 以智能驾驶为例,目前的供应链形态,也正处于变革的关键周期。各路玩家也都在尝试与车企合作模式的多元化。 高工…

并发请求控制

Chrome 浏览器最多并发6个请求。一般情况下,我们都会设置并发数为 3。 并发请求控制主要有两种区别:假设并发数为 3 三个请求为一组进行并发,这三个请求全部完成了,再进行下一组。在第一种方式的基础上加上滑动补位,…

Express框架开发接口之前台分类导航

1.初始化 const handleDB require(../handleDB/index) // 获取全部导航 exports.allNav (req, res) > {(async function () {})() } // 更新或者添加导航 exports.upNav (req, res) > {(async function () {})() } // 根据id删除 exports.delNav (req, res) > {(a…

Mac电脑风扇控制推荐 Macs Fan Control Pro 中文 for mac

Macs Fan Control Pro是一款功能全面、易于使用且具有良好兼容性和安全性的风扇控制软件,适用于各种Mac用户。 除了能够调整风扇速度外,Macs Fan Control Pro还支持实时监测硬件传感器的温度,例如CPU、硬盘等,同时显示每个传感器…

SpringBoot系列之自定义Jackson对象映射器格式日期数据

开发环境 JDK 1.8SpringBoot2.2.1Maven 3.2Mysql5.7.36开发工具 IntelliJ IDEAsmartGit 背景 在我之前的博客中,有对Springboot2.0集成Mybatis Plus做了比较详细的描述,现在这篇博客介绍,基于开源的jackson api来自定义ObjectMapping&…

MPLAB X IDE 仿真打断点提示已中断的断点?

这种中间带裂缝的是无效断点。 原因可能与XC编译器的优化有关,最后生成的汇编与C语言并不是一一对应的(官方给的解释是效率高)。所以这一行C语言转换的汇编代码可能并不在这个位置,也可能与其它汇编合并后根本就没有 我的解决方法是把优化等级调到最低&a…

【多线程面试题二十二】、 说说你对读写锁的了解

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:说说你对读写锁的了解 …

windows server 2016调优

1. 增加TCP连接的最大数量: 在您当前的注册表路径(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters)中的右侧窗格,右击空白处,选择“新建” -> “DWORD (32位) 值”。为新的值命名为TcpNu…

Python:PDF转长图像和分页图像

简介:随着电子化文档的普及,PDF文件的使用频率越来越高。有时我们需要将PDF中的内容转化为图片格式进行分享或编辑,那么如何才能轻松地完成此任务呢?本文将为你展示一个Python工具:如何将PDF文件转化为图片&#xff0c…

Macroscope安全漏洞检测工具简介

学习目标: 本介绍旨在帮助感兴趣者尽快了解 Macroscope,这是一款用于安全测试自动化和漏洞管理的企业工具。 全覆盖应用程序安全测试: 如下图所示,如果使用多种互补工具(SAST/DAST/SCA 等)来检测应用程序…

redis的两种持久化的方式 RDB AOF

1. RDB持久化 就是将某个时间点的数据快照,全部保存在磁盘的二进制文件中。 可以选择命令手动触发: save命令,阻塞式保存快照数据,会阻塞其它操作 bgsave,开启子线程执行RDB 或者配置文件配置自动触发: 在r…

C#中只能在.NetFramework下使用LINQtoSQL不要在.net 下使用

目录 一、在net7.0下无法实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 二、在.NetFramework4.8下成功实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 三、结论 四、理由 本文是个人观点,因为我百般努力在.net7.0下无法实现LINQtoSQL的…

走近Python爬虫(二):常见反爬虫机制的应对措施

文章目录 一、应对—异步加载1.一般措施2.Selenium 二、应对—登录验证1.使用Selenium模拟登录2.使用Cookies登录3.使用Session模拟表单登录 三、应对—验证码 本文是Python爬虫系列博客的第二篇,内容概览如下: 一、应对—异步加载 1.一般措施 AJAX技术…

【操作系统】Cygwin和MinGW的区别与联系是怎样的?

Cygwin和MinGW的区别与联系是怎样的? CygwinMinGW两者的区别和联系参考资料 Cygwin和MinGW都是为Windows系统开发者设计的工具。 Cygwin Cygwin, 原Cygnus出品,目前是RedHat名下的项目。项目的目的是提供运行于Windows平台的类Unix环境&…

Linux - 浅析守护进程的概念

Linux下的守护进程是在后台运行的特殊进程,它不与任何终端关联,通常在系统启动时自动启动,运行在后台并且不受用户登录或注销的影响。Linux 下的守护进程通常是以系统管理员的权限运行,用来执行一些系统任务,例如监控硬…