MonitorSDK_监测用户行为(点击、页面路由变化、页面浏览量变化)

article/2025/7/2 13:35:53

点击事件监测

为了实现用户点击事件的监控和数据埋点,可以通过监听全局的 mousedown 和 touchstart 事件,收集用户交互数据,并将其上报到服务器。

export default  function onClick(){['mousedown', 'touchstart'].forEach( eventType => { document.addEventListener(eventType, function(event) {const target=event.target as HTMLElement | null;;if(target?.tagName){const reportData={type:'behavior',subType: 'click',target : target.tagName,startTime: event.timeStamp,innerHtml: target.innerHTML,outerHtml: target.outerHTML,with: target.offsetWidth,height: target.offsetHeight,eventType,// path:event.path,path: (event as unknown as { path: (HTMLElement | EventTarget)[] }).path?.map(el =>(el as HTMLElement).outerHTML),}//TODO上报数据}})
})
}

该函数监听了 mousedown 和 touchstart 事件,捕获用户的点击行为,并收集了以下信息:

  • 事件类型(eventType)
  • 事件触发时间(startTime)
  • 目标元素的标签名(target)
  • 目标元素的 HTML 内容(innerHtml 和 outerHtml)
  • 目标元素的尺寸(width 和 height)
  • 事件路径(path)
    在这里插入图片描述

埋点设计

在这里插入图片描述
在前端开发中,埋点技术用于收集用户行为数据,常见的实现方式包括手动埋点、自动埋点和可视化埋点。以下是对这三种方式的设计与实现的详细说明:(AlibabaCloud)


1. 手动埋点

设计思路: 开发人员在代码中手动添加埋点逻辑,针对特定的用户行为(如点击、提交等)进行数据收集。(CSDN)

实现方式:

  • 事件监听: 在需要埋点的元素上添加事件监听器。(美团技术)

  • 数据收集: 在事件处理函数中,收集相关数据,如事件类型、时间戳、元素信息等。

  • 数据上报: 将收集到的数据通过网络请求发送到服务器。

示例代码(以 Vue 为例):

<template><button @click="handleClick">点击我</button>
</template><script>
export default {methods: {handleClick() {// 收集数据const eventData = {eventType: 'click',element: 'button',timestamp: Date.now()};// 上报数据sendEventData(eventData);}}
};
</script>

优缺点:

  • 优点: 灵活性高,能够精确控制埋点逻辑。(CSDN)

  • 缺点: 需要手动添加和维护埋点代码,工作量大,容易遗漏。(知乎专栏)


2. 自动埋点

设计思路: 通过全局事件监听器自动捕获用户的交互行为,无需在每个元素上手动添加埋点代码。(CSDN)

实现方式:

  • 全局监听: 在应用初始化时,添加全局事件监听器(如 click 事件)。

  • 事件过滤: 在事件处理函数中,过滤出需要埋点的事件。

  • 数据收集与上报: 收集事件相关数据,并发送到服务器。

示例代码:

document.addEventListener('click', function(event) {const target = event.target;if (target) {const eventData = {eventType: 'click',tagName: target.tagName,id: target.id,classes: target.className,timestamp: Date.now()};sendEventData(eventData);}
});

优缺点:

  • 优点: 实现简单,能够覆盖大部分用户行为。

  • 缺点: 可能会收集到大量无用数据,增加数据处理的复杂度。(CSDN)


3. 可视化埋点

设计思路: 通过可视化工具,允许非开发人员(如产品经理)在页面上选择需要埋点的元素,自动生成和部署埋点逻辑。(CSDN)

实现方式:

  • 工具选择: 使用如 Google Analytics、Mixpanel、Amplitude 等可视化埋点工具。(人人都是产品经理)

  • 元素选择: 在工具界面中,选择需要埋点的页面元素。

  • 事件配置: 为选中的元素配置需要监听的事件类型。

  • 数据上报: 工具自动生成埋点代码,并在用户交互时收集数据并上报。(CSDN)

优缺点:

  • 优点: 操作简单,非开发人员也能配置埋点,减少开发工作量。

  • 缺点: 灵活性和精确度可能不如手动埋点,受限于工具的功能。(CSDN)


总结对比

埋点方式优点缺点适用场景
手动埋点精确控制,灵活性高工作量大,易遗漏关键业务流程,精细化分析
自动埋点实现简单,覆盖面广数据冗余,处理复杂快速部署,全面行为收集
可视化埋点操作简便,非技术人员可操作灵活性差,依赖工具功能快速迭代,非技术人员参与(CSDN)

根据项目需求和资源情况,可以选择合适的埋点方式,或结合使用多种方式,以达到最佳的数据收集效果。

页面路由变化(pageChange)

在前端单页应用中,hash模式通过URL的#部分实现路由(如example.com/#/home),依赖window.onhashchange监听变化,兼容性强且无需服务端配置,但不利于SEO且URL不够简洁;history模式基于HTML5 History API(如pushState/replaceState),URL形式为example.com/home,更利于SEO和用户体验,但需服务端配置支持(避免刷新404),且兼容性要求较高(IE11+)。hash模式适合对兼容性要求高的项目,history模式更适合追求优雅URL和SEO优化的场景。

路由模式:hash vs history 详解

特性hash 模式history 模式
URL 样式http://example.com/#/pathhttp://example.com/path
基于URL 的 window.location.hash 部分HTML5 History API (pushState, replaceState)
是否需要后端支持不需要需要(否则刷新页面会 404)
兼容性兼容 IE9+需要 HTML5 支持,IE11+ 或现代浏览器
SEO 友好度较差较好(需 SSR 支持)
监听变化方式window.onhashchangewindow.onpopstate + 自定义拦截导航

📌 如何监听路由变化

1. hash 模式监听

使用 window.onhashchange 事件:

window.addEventListener('hashchange', () => {console.log('Hash changed to: ', window.location.hash);
});

你也可以封装一个简单的监听器:

function observeHashChange(callback: () => void) {window.addEventListener('hashchange', callback);
}// 使用示例
observeHashChange(() => {console.log('当前 hash:', window.location.hash);
});

2. history 模式监听

history 模式无法通过简单事件监听所有变化,因为 pushStatereplaceState 不会触发任何浏览器事件。

✅ 方法一:劫持 pushStatereplaceState

你可以重写这两个方法来实现监听:

const originalPushState = window.history.pushState;
const originalReplaceState = window.history.replaceState;window.history.pushState = function (state, title, url) {const result = originalPushState.apply(this, [state, title, url]);window.dispatchEvent(new Event('locationchange'));return result;
};window.history.replaceState = function (state, title, url) {const result = originalReplaceState.apply(this, [state, title, url]);window.dispatchEvent(new Event('locationchange'));return result;
};// 监听自定义事件
window.addEventListener('locationchange', () => {console.log('History changed to:', window.location.pathname);
});
✅ 方法二:监听 popstate 事件(仅响应浏览器前进/后退按钮)
window.addEventListener('popstate', () => {console.log('Popstate triggered, current path:', window.location.pathname);
});

⚠️ 注意:popstate 不会在 pushStatereplaceState 调用时触发


总结

场景推荐方式
Hash 模式监听window.onhashchange
History 模式监听重写 pushState/replaceState 并派发事件
浏览器导航(前进/后退)window.onpopstate

//路由模式:history&hashimport{generateUniqueId} from '../utils'export default function pageChange() { let oldUrl="";//hash 路由模式window.addEventListener('hashchange', function (event) {console.log('hashchange',event);const newUrl = event.newURL;const reportData = {form: oldUrl,to: newUrl,type: 'behavior',subType: 'hashchange',startTime: performance.now(),uuid: generateUniqueId(),};//TODO:上报数据oldUrl = newUrl;});//history模式监听let from="";window.addEventListener('popstate', function (event) {console.log('popstate',event);const to = window.location.href;const reportData = {form: from,to: to,type: 'behavior',subType: 'popstate',startTime: performance.now(),uuid: generateUniqueId(),};//TODO:上报数据from=to;})
}

页面浏览量监测(PV)

import { generateUniqueId } from "../utils";//PV(Page View) 是指 页面浏览量,每当用户加载或刷新一个网页时,就会产生一次 PV 记录。
export default function pv(){const reportData = {type: 'behavior',subType: 'pv',startTime: performance.now(),pageUrl: window.location.href,referror: document.referrer,uuid: generateUniqueId(),}//TIOD:上报数据}

📌 什么是 PV?

PV(Page View) 是指 页面浏览量,是衡量网站流量的重要指标之一。每当用户加载或刷新一个网页时,就会产生一次 PV 记录。


🔍 PV 的详细解释

项目说明
英文全称Page View
中文含义页面浏览量
用途统计用户对页面的访问次数
特点每次页面加载(包括刷新)都会增加 PV 数
应用场景网站统计、性能监控、用户行为分析、广告计费等

🧠 PV 和 UV、VV 的区别

类型含义特点
PVPage View(页面浏览量)每次页面加载都计数一次
UVUnique Visitor(独立访客)同一用户一天内多次访问只计一次
VVVisit View(访问次数)用户每次进入网站算一次访问,关闭后再次进入也算新访问

示例:
一个用户打开页面3次 → PV=3, UV=1, VV=1 或 3(取决于定义)


💡 pv.ts

文件是一个用于记录页面浏览行为(PV)的模块,它做了以下几件事:

import { generateUniqueId } from "../utils";export default function pv(){const reportData = {type: 'behavior',subType: 'pv', // 表示这是一个 PV 行为事件startTime: performance.now(), // 当前页面加载时间戳(高精度)pageUrl: window.location.href, // 当前页面的 URLreferrer: document.referrer, // 来源页面地址uuid: generateUniqueId(), // 唯一标识当前访问}// TODO: 上报数据(通常发送到埋点服务器)
}
✅ 字段详解:
字段名类型描述
typestring行为类型,这里是 'behavior'
subTypestring子类型,这里是 'pv'(页面浏览)
startTimenumber页面开始加载的时间戳(单位 ms)
pageUrlstring当前页面完整 URL
referrerstring上一个页面的 URL(即从哪个页面跳转来的)
uuidstring本次访问的唯一 ID,用于去重或追踪用户行为链

📦 实际应用建议

你可以将 通过 fetchBeacon 发送到后端埋点服务,用于后续分析和展示 PV 趋势、用户路径等。

示例上报逻辑(可补充):

navigator.sendBeacon('/log', JSON.stringify(reportData));
// 或使用 fetch
fetch('/log', {method: 'POST',body: JSON.stringify(reportData),keepalive: true
});

✅ 总结

  • PV 是最基本的页面访问统计单位。
  • 在前端 SDK 中,PV 通常用于:
    • 监控用户访问频率
    • 分析页面停留时间
    • 支持 A/B 测试、转化率分析等
  • 你当前的实现已经具备基础采集能力,只需补全上报逻辑即可投入使用。

如需我帮你完善埋点上报逻辑或者加入采样控制、节流策略,请告诉我!

在这里插入图片描述


http://www.hkcw.cn/article/xvmoctsdnV.shtml

相关文章

NE555输出PWM驱动NMOS控制灯光电路Multisim仿真

仿真电路&#xff1a; 遇到的一些问题&#xff1a; 1、NE555怎么产生PWM波形&#xff1f; 解&#xff1a; 555定时器频率计算器_555定时器频率在线计算_电路参数计算 - 电子发烧友(www.elecfans.com) 这个在线工具可以通过设定频率、占空比、电阻&#xff0c;从而求出电阻值…

ThinkPrune:在RL中引入长度限制,在保持性能一致或略有提升下,显著提升推理效率

摘要&#xff1a;我们提出了THINKPRUNE&#xff0c;这是一种简单而有效的方法&#xff0c;用于缩短长思考型大语言模型&#xff08;LLMs&#xff09;的思考长度。这些模型被发现常常会产生低效且冗余的思考过程。现有的关于减少思考长度的初步探索主要集中在迫使思考过程提前结…

重温经典算法——堆排序

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 堆排序是一种基于二叉堆的排序算法&#xff0c;时间复杂度为O(n log n)。堆排序核心步骤包括构建最大堆和反复取出堆顶元素排序&#xff1a;首先从最后一个非叶子…

PyTorch——卷积层(3)

conv_arithmetic/README.md at master vdumoulin/conv_arithmetic GitHub out_channel1 out_channel2

5.29 自学测试 Linux基础 Day4

一、Linux操作系统介绍 1.操作系统介绍&#xff1a; 管理计算机硬件与软件资源的计算机程序&#xff0c;同时也是计算机系统的内核与基石。 2.常见的操作系统 桌面操作系统&#xff1a;Windows系列、Linux、MacOS 嵌入式操作系统&#xff1a;Linux 服务器操作系统&#x…

推荐一款使用html开发桌面应用的工具——mixone

简介 mixone是开发桌面应用&#xff08;Win、Mac、Linux&#xff09;的一款工具、其基于electron实现。其拥有简单的工程结构。以为熟悉前端开发的程序员可以很轻松的开发出桌面应用&#xff0c;它比electron的其他框架更简单&#xff0c;因为那些框架基本上还需要了解electro…

leetcode hot100 二叉树(二)

书接上回&#xff1a;https://blog.csdn.net/weixin_74129837/article/details/148367615?spm1001.2014.3001.5501 8.验证二叉搜索树 维护一个min_val和max_val&#xff0c;限制当前结点的合法值范围。min_val和max_val动态变化。 class Solution { public:bool check(Tree…

【Linux】基础文件IO

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 前言 无论是日常使用还是系统管理&#xff0c;文件是Linux系统中最核心的概念之一。对于初学者来说&#xff0c;理解文件是如何被创建、读取、写入以及存储…

MYSQL MGR高可用

1&#xff0c;MYSQL MGR高可用是什么 简单来说&#xff0c;MySQL MGR 的核心目标就是&#xff1a;确保数据库服务在部分节点&#xff08;服务器&#xff09;发生故障时&#xff0c;整个数据库集群依然能够继续提供读写服务&#xff0c;最大限度地减少停机时间。 2. 核心优势 v…

【java面试】MySQL篇

MySQL篇 一、总体结构二、优化&#xff08;一&#xff09;定位慢查询1.1 开源工具1.2Mysql自带的慢日志查询1.3 总结 &#xff08;二&#xff09;定位后优化2.1 优化2.2 总结 &#xff08;三&#xff09;索引3.1 索引3.2 索引底层数据结构——B树3.3 总结 &#xff08;四&#…

头像预览和上传

在写一个项目的时候&#xff0c;遇到了头像修改这个功能的需求&#xff0c;在最开始的学习中发现可以通过type为file的input文件读取图片&#xff0c;然后将其转换为DataUrl格式&#xff0c;最终作为Ima元素的src即可在页面上展示图片。但到后面开始写交互的时候发现DataUrl格式…

解锁效率新高度:Agent Zero智能助手框架

探索Agent Zero AI框架&#xff1a;您的个性化智能助手 在迅速发展的科技世界&#xff0c;Agent Zero AI框架为我们揭开了一个全新的大门。被设计成能够与用户同步成长与学习的智能助手&#xff0c;Agent Zero展现了它作为个性化使用工具的非凡潜力。在本篇文章中&#xff0c;…

第43节:Vision Transformer (ViT)视觉领域的革命性架构

1. ViT的诞生背景与核心思想 Vision Transformer (ViT) 是2020年由Google Research团队提出的一种革命性计算机视觉架构,它将自然语言处理(NLP)领域中大获成功的Transformer模型引入到计算机视觉任务中。这一创新彻底改变了传统卷积神经网络(CNN)在视觉任务中的主导地位,为图…

leetcode0513. 找树左下角的值-meidum

1 题目&#xff1a;找树左下角的值 官方标定难度&#xff1a;中 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7]…

从webshell管理工具(蚁剑 冰蝎 哥斯拉 菜刀 哥斯拉等)程控制主机后,再将这个控制能力上线到MSF 为什么要这么做了?一篇文章告诉你

目录 一、为什么Webshell管理工具需要上线到Metasploit&#xff1f; 什么情况下需要上线到Metasploit&#xff1f; 二、常见Webshell管理工具及上线Metasploit的步骤 1. 蚁剑&#xff08;AntSword&#xff09;上线到Metasploit 上线步骤&#xff1a; 实际案例&#xff1a…

【Ragflow】24.Ragflow-plus开发日志:增加分词逻辑,修复关键词检索失效问题

概述 在RagflowPlus v0.3.0 版本推出之后&#xff0c;反馈比较多的问题是&#xff1a;检索时&#xff0c;召回块显著变少了。 如上图所示&#xff0c;进行检索测试时&#xff0c;关键词相似度得分为0&#xff0c;导致混合相似度(加权相加得到)也被大幅拉低&#xff0c;低于设定…

YOLOv5 :训练自己的数据集

- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 我们接着上一篇文章配置完YOLOv5需要的环境后&#…

【Unity】云渲染

1 前言 最近在搞Unity云渲染的东西&#xff0c;所以研究了下官方提供的云渲染方案Unity Renderstreaming。注&#xff1a;本文使用的Unity渲染管线是URP。 2 文档 本文也只是介绍基本的使用方法&#xff0c;更详细内容参阅官方文档。官方文档&#xff1a;Unity Renderstreamin…

每日一道面试题---ArrayList的自动扩容机制(口述版本)

首先&#xff0c;ArrayList是基于动态数组实现的&#xff0c;它的容量是可以动态增长的&#xff0c;ArrayList的默认容量是10&#xff0c;当我们向ArrayList中插入一个数据时&#xff0c;第一步&#xff0c;会先进行一个条件的校验操作&#xff0c;先去判断ArrayList是不是一个…

分布式锁优化:使用Lua脚本保证释放锁的原子性问题

分布式锁优化&#xff08;二&#xff09;&#xff1a;使用Lua脚本保证释放锁的原子性问题 &#x1f4bb;黑马视频链接&#xff1a;Lua脚本解决多条命令原子性问题 在上一章节视频实现了一个可用的Redis分布式锁&#xff0c;采用SET NX EX命令实现互斥和过期自动释放机制&…