首先,进入页面的时候,浏览器会调用onload事件,浏览器关闭时,浏览器会调用beforeunload事件,可以从这两个事件入手。但是这里有几个问题,那就是浏览器刷新的时候,也会调用beforeunload,还有就是如何知道用户在其它标签页也打开了网页呢?有什么可以记录浏览器是否刷新呢?这时候便想到了sessionStorage。 4 d J1 z" x0 z4 k' R sessionStorage,用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。也就是说数据存储在sessionStorage中,在当前标签页会一直存在。 . N# S0 I4 N. f3 }3 X" H 首先在初次进入页面时在onload事件中往sessionStorage存入一个标识% k2 ~0 P; H& z) l+ Y
window.addEventListener("load",function(){
let nowTime = getNowTime()
let openPageCount = localStorage.getItem("openPageCount")
openPageCount = openPageCount ? parseInt(openPageCount) : 0
openPageCount += 1
localStorage.setItem("openPageCount",openPageCount)
refreshTime()
let isRightTime = compareRefreshTime()
//其实说明是页面是刷新后加载的,不需要统计开始时间
if(sessionStorage.getItem("flag") && isRightTime){
return;
}
localStorage.setItem("startTime",nowTime)
localStorage.setItem("refreshTime",nowTime)
sessionStorage.setItem("flag", true);
})
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
}
function refreshTime(){
setTimeout(refreshTime ,30 * 1000)
let nowTime = getNowTime()
localStorage.setItem("refreshTime",nowTime)
}
应用场景可以是统计手机App使用时长、统计用户打开网站后多久会关闭,这都是属于大数据的范畴。8 f, z0 E& m5 [7 c
由此可以拓展到用户使用每个页面的浏览时长,统计每个页面浏览时长可以更好的统计哪些页面是用户经常浏览,从而更好的优化这些页面,而浏览量比较少的或者没有浏览量的页面应该重新设计或者花更少时间去维护。而在前端方面存储这些数据的实现思路总体是差不多的。& U3 T. U% B. d
当然上面的方法也有一定的缺点,比如数据可能会丢失、每个打开的页面都要启动一个定时器等等。 ( C" g$ f5 c; j5 C4 T0 y+ u 如果需要数据更精准些,我们可以使用websocket或者启动一个定时器定时向后台传数据等等,这样会也有一点的缺点,比如增大服务器压力,影响性能。