js 统计用户停留网站时长

统计用户停留网站时长

统计用户时长的意义和一些思路说明

应用场景可以是统计手机App使用时长、统计用户打开网站后多久会关闭,这都是属于大数据的范畴。

由此可以拓展到用户使用每个页面的浏览时长,统计每个页面浏览时长可以更好的统计哪些页面是用户经常浏览,

从而更好的优化这些页面,而浏览量比较少的或者没有浏览量的页面应该重新设计或者花更少时间去维护。

而在前端方面存储这些数据的实现思路总体是差不多的。

当然上面的方法也有一定的缺点,比如数据可能会丢失、每个打开的页面都要启动一个定时器等等。

如果需要数据更精准些,我们可以使用websocket或者启动一个定时器定时向后台传数据等等,这样会也有一点的缺点,比如增大服务器压力,影响性能。

具体实现方式

js 复制代码
// 进入页面 - load
window.addEventListener("load",function(){
    let nowTime = getNowTime()
    let openPageCount = localStorage.getItem("openPageCount")
    openPageCount = openPageCount ? parseInt(openPageCount) : 0
    openPageCount += 1
    localStorage.setItem("openPageCount",openPageCount)
    // 用户意外关掉电脑或者突然断电了,这时候是不会执行beforeunload是不会执行
    refreshTime()
    let isRightTime =  compareRefreshTime()
    //其实说明是页面是刷新后加载的,不需要统计开始时间
    if(sessionStorage.getItem("flag") && isRightTime){
        return;
    }
    localStorage.setItem("startTime",nowTime)
    localStorage.setItem("refreshTime",nowTime)
    sessionStorage.setItem("flag", true);
})

// 浏览器关闭 - beforeunload
window.addEventListener("beforeunload",function(){
    let nowTime = getNowTime()
    let openPageCount = localStorage.getItem("openPageCount")
    openPageCount -= 1
    localStorage.setItem("endTime",nowTime)
    localStorage.setItem("openPageCount",openPageCount)
    if(openPageCount == 0){
        //说明页面全部关闭,这时候可以传数据给后台
    }
})

function getNowTime(){
    let nowTime = new Date().getTime()
    return nowTime
}

function compareRefreshTime(){
   let nowTime = getNowTime()
   let refreshTime = localStorage.getItem("refreshTime")
   return nowTime - refreshTime < 60 * 1000
}
// 可以往localStorage里存一个刷新时间,每30秒更新这个刷新时间
// 用户加载网站时,读取这个刷新时间,如果当前时间和这个刷新时间相差大于1分钟,说明数据有断层,此时应该抛弃这一条记录数据
function refreshTime(){
    // 避免意外关机导致数据统计丢失问题
    setTimeout(refreshTime ,30 * 1000)
    let nowTime = getNowTime()
    localStorage.setItem("refreshTime",nowTime)
}

其实这种直接在后台java统计也是可以的,以上只是js的实现方式。

相关推荐
weedsfly3 小时前
还在用 Axios?你可能需要重新理解 XHR 与 Fetch
前端·javascript·面试
CoderWeen3 小时前
从零实现一个 Vue3 流程图编辑器:节点拖拽、贝塞尔连线与框选
前端·javascript
To_OC13 小时前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
kyriewen17 小时前
我用 50 行代码重写了 React Router 核心,终于搞懂了前端路由原理
前端·javascript·react.js
Asize20 小时前
HTML5 Canvas 基础:从按帧动画到 ECharts 数据可视化
前端·javascript·canvas
默_笙20 小时前
🎄 后端给我一堆扁平数据,我 10 行代码把它变成了树
前端·javascript
前端Hardy20 小时前
又一个 AI 神器火了!
前端·javascript·后端
PBitW20 小时前
GPT训练我的第二天,我表示不过如此!!!😕😕😕
前端·javascript·面试
kyriewen21 小时前
白宫直接给 OpenAI 下了限制令,GPT-5.6 不能随便放出来了
前端·javascript·面试
默_笙1 天前
🍞 我用 CSS 画了一个会转的 3D 立方体,同事以为我学了 Three.js(这节课真的很神奇,我很喜欢)
javascript