TimeOnPage.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. //计算账号累计活跃时长
  2. import global from '@/config/setting';
  3. import {timeOnPage} from '@/api/api.js';
  4. //活跃时间间隔 (s)
  5. const TimeInterval = 60*10
  6. //页面停留时间 (s)
  7. let stayTime = 0
  8. let timer = null
  9. //打开计时器
  10. export const optionTimeCalc = ()=>{
  11. const IsActive = sessionStorage.getItem('IsActive')
  12. if(Number(IsActive)===0){
  13. //console.log('打开计时器')
  14. sessionStorage.setItem('IsActive',1)
  15. timeStr = new Date().getTime()
  16. startCalc()
  17. }
  18. }
  19. //开始计时
  20. export const startCalc = ()=>{
  21. sessionStorage.setItem('preTitle',document.title)
  22. timer = setInterval(()=>{
  23. stayTime++
  24. if(stayTime>=TimeInterval){
  25. endCalc('timeup',0)
  26. }
  27. },1000)
  28. }
  29. //结束计时
  30. export const endCalc = (type,intervalT)=>{
  31. //console.log('关闭计时器')
  32. clearInterval(timer)
  33. const IsActive = sessionStorage.getItem('IsActive')
  34. if(Number(IsActive)){
  35. sendTOPInfo(type,intervalT)
  36. }
  37. stayTime = 0
  38. /* if(type==='timeup'){
  39. sessionStorage.setItem('IsActive',0)
  40. } */
  41. timeStr = new Date().getTime()
  42. sessionStorage.setItem('IsActive',0)
  43. }
  44. //发送活跃时长数据
  45. export const sendTOPInfo = (type,intervalT)=>{
  46. //获取上一个页面标题
  47. const Title = sessionStorage.getItem('preTitle')
  48. //console.log('发送活跃时长数据 ↓↓↓')
  49. //获取计时间隔时间和页面名称
  50. if(type==='timeup'){
  51. console.table([{'停留时间(timeup)':stayTime+' s','停留页面':Title}])
  52. }else{
  53. console.table([{'停留时间(other)':Number(intervalT)/1000+' s','停留页面':Title,'触发类型':type}])
  54. }
  55. const Part = Title.split('-').length>1?Title.split('-')[1]:Title
  56. const ActiveTime = type==='timeup'?stayTime:Number(intervalT)/1000
  57. //发送数据
  58. if(!Part.length||Part==global.name) return
  59. if(ActiveTime>TimeInterval*12) return
  60. console.log("ActiveTime:",ActiveTime,"Part:",Part)
  61. timeOnPage({
  62. ActiveTime:Math.round(ActiveTime),
  63. Part:Part
  64. }).then(res=>{
  65. if(res.Ret!==200) return
  66. })
  67. }
  68. //路由监听部分
  69. //source https://juejin.cn/post/6905913200060366862#heading-2
  70. let timeStr=null
  71. let rewriteHis = function(type){
  72. let origin = window.history[type]
  73. return function(){
  74. let rs = origin.apply(this, arguments)
  75. let e = new Event(type.toLocaleLowerCase())
  76. e.arguments = arguments
  77. window.dispatchEvent(e)
  78. return rs
  79. }
  80. }
  81. export const doPageEventListener=function(){
  82. window.history.pushState = rewriteHis('pushState')
  83. window.history.replaceState = rewriteHis('replaceState')
  84. //刷新加载完成
  85. window.addEventListener('load',(e)=>{
  86. const unloadT = sessionStorage.getItem('unloadT')
  87. const IsActive = sessionStorage.getItem('IsActive')
  88. if(unloadT){
  89. //console.log('刷新该页呆了时长',unloadT)
  90. sessionStorage.removeItem('unloadT')
  91. sessionStorage.setItem('preTitle',document.title)
  92. if(Number(IsActive)){
  93. endCalc('unload',unloadT)
  94. }
  95. }
  96. console.log('onload')
  97. timeStr = new Date().getTime()
  98. optionTimeCalc()
  99. })
  100. //刷新离开页面
  101. window.addEventListener('beforeunload',(e)=>{
  102. console.log('unload')
  103. let t = new Date().getTime() - timeStr
  104. const IsActive = sessionStorage.getItem('IsActive')
  105. if(Number(IsActive)){
  106. sessionStorage.setItem('unloadT',t)
  107. }
  108. })
  109. //popstate会在router.before/afterEach 之前触发,所以这里不对计时操作,操作放到before/afterEach
  110. window.addEventListener('popstate',(e)=>{
  111. //console.log('popState',e)
  112. let t = new Date().getTime() - timeStr
  113. timeStr = new Date().getTime()
  114. //console.log('待了时长popstate:'+ t)
  115. sessionStorage.setItem('routerChangeType','popstate')
  116. sessionStorage.setItem('popStayTime',t)
  117. })
  118. window.addEventListener('pushstate',()=>{
  119. let t = new Date().getTime() - timeStr
  120. timeStr = new Date().getTime()
  121. //console.log('待了时长pushstate:'+ t)
  122. const IsActive = sessionStorage.getItem('IsActive')
  123. if(Number(IsActive)){
  124. endCalc('pushstate',t)
  125. }
  126. optionTimeCalc()
  127. })
  128. window.addEventListener('replacestate',()=>{
  129. let t = new Date().getTime() - timeStr
  130. timeStr = new Date().getTime()
  131. //console.log('待了时长replacestate:'+ t)
  132. const IsActive = sessionStorage.getItem('IsActive')
  133. if(Number(IsActive)){
  134. endCalc('replacestate',t)
  135. }
  136. optionTimeCalc()
  137. })
  138. //页面监听
  139. /* document.addEventListener('visibilitychange', function () {
  140. // 用户离开了当前页面
  141. if (document.visibilityState === 'hidden') {
  142. console.log('hidden')
  143. const IsActive = sessionStorage.getItem('IsActive')
  144. if(Number(IsActive)){
  145. let t = new Date().getTime() - timeStr
  146. timeStr = new Date().getTime()
  147. endCalc('hidden',t)
  148. }
  149. }
  150. // 用户打开或回到页面
  151. if (document.visibilityState === 'visible') {
  152. console.log('visible')
  153. const IsActive = sessionStorage.getItem('IsActive')
  154. if(IsActive==='0'){
  155. timeStr = new Date().getTime()
  156. optionTimeCalc()
  157. }
  158. }
  159. }); */
  160. document.addEventListener('click',(e)=>{
  161. //console.log('click',e,e.composedPath())
  162. //只计算displayMain 的click
  163. const path = e.composedPath()
  164. const contentIndex = path.findIndex((item)=>{return item.className==="content-container"})
  165. if(contentIndex===-1) return
  166. //console.log('合法的click')
  167. const IsActive = sessionStorage.getItem('IsActive')
  168. if(Number(IsActive)===0){
  169. optionTimeCalc()
  170. }else{
  171. //console.log('重置活跃计时')
  172. //重置活跃时间
  173. stayTime = 0
  174. }
  175. })
  176. }