by weber开发者 from http://weber.pub/

本文地址: http://weber.pub/js记录用户行为浏览记录和停留时间/163.html

问题

公司想统计一个用户从进入官网到注册,这个流程该用户整个的浏览路线,在哪个页面停留的时间比较长,从而更有针对性的对客户行为进行分析,了解用户的真正需求。。。

虽然百度统计之类的也可以记录用户的浏览行为,但是这类统计是全部跟踪用户,而无法精确的跟踪到注册的用户之前一系列的行为,而我们只需要针对注册用户进行有目的性的行为分析。。。


演示地址:http://weber.pub/demo/160902/test.html

测试源码下载:http://pan.baidu.com/s/1nvPKbSP 密码:r147


解决问题所使用的知识(可以跳过直接看下面的解决方案)

1、setInterval

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。

  1. setInterval(code,millisec[,"lang"])
  • 1
  • code 必需。要调用的函数或要执行的代码串。
  • millisec 必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。
  • lang 可选。 JScript | VBScript | JavaScript

2、localStorage

HTML5 提供的客户端存储数据的新方法,localStorage 没有时间限制的数据存储。

之前,这些都是由 cookie 完成的。但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie速度很慢而且效率也不高。对于不同的网站,数据存储于不同的区域,并且一个网站只能访问其自身的数据。

  • 存储数据方法
  1. var arr = [0, 1, 2, 3];
  2. localStorage.setItem("num", arr);
  • 1
  • 2
  • 读取数据方法
  1. localStorage.getItem("num");
  • 1

3、onbeforeunload

onbeforeunload 事件在即将离开当前页面(刷新或关闭)时触发。 
该事件可用于弹出对话框,提示用户是继续浏览页面还是离开当前页面。

另外: 
- 页面加载时只执行onload 
- 页面关闭时先执行onbeforeunload,最后onunload 
- 页面刷新时先执行onbeforeunload,然后onunload,最后onload

4、eval()

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

这里我使用eval() 来解析JSON字符串。

  1. var dataObj=eval("("+data+")");//转换为json对象
  • 1

eval这里要添加"("+data+")" 一对小括号,原因在于:eval本身的问题。 由于json是以{}的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。

  1. var weber = '[{"url":"weber.pub","name":"web开发者","time":"160902"},{"url":"www.weber.pub","name":"canglingyue","time":"160823"}]';
  2. var eWeber = eval('(' + weber + ')');
  3. console.log(eWeber);
  • 1
  • 2
  • 3

5、JSON.stringify

JSON.stringify()JavaScript值转换为JavaScript对象表示法 (Json) 字符串(详细解释可参照

6、referrer

refer 是用来获取用户来路url 就是告诉人家我是从哪个页面过来的,可以用于统计访问本网站的用户来源,也可以用来防盗链。

  1. function getReferrer() {
  2. var referrer = '';
  3. try {
  4. referrer = window.top.document.referrer;
  5. } catch(e) {
  6. if(window.parent) {
  7. try {
  8. referrer = window.parent.document.referrer;
  9. } catch(e2) {
  10. referrer = '';
  11. }
  12. }
  13. }
  14. if(referrer === '') {
  15. referrer = document.referrer;
  16. }
  17. return referrer;
  18. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

解决方案

原来是想使用 cookie 来记录,但是考虑到 cookie 所能记录的数据最大为 4k ,可能不够用,于是使用了 HTML5 的 localStorage (最大数据 5M )来存储( IE8 以上浏览器支持)。这里使用到了 jquery.cookie 的插件,所以页面要引入 jquery 和 jquery.cookie (关于 cookie 的使用有问题可以查看这篇文章的介绍原生js和jquery处理cookie的插件介绍

代码分段解析

  1. var second = 0;
  2. window.setInterval(function () {
  3. second ++;
  4. }, 1000);
  • 1
  • 2
  • 3
  • 4

当用户进入页面我们就会启动一个定时器,这个定时器可以记录用户在该页面浏览时间


  1. var tjArr = localStorage.getItem("jsArr") ? localStorage.getItem("jsArr") : '[{}]';
  2. $.cookie('tjRefer', getReferrer() ,{expires:1,path:'/'});
  • 1
  • 2

定义存储数据的变量 tjArr ,如果已经存到 localStorage 则从中读取,没有这初始化数据。

获取用户的 refer 信息,并存入 cookie 之中(后面解决页面刷新问题会使用到)。


  1. var dataArr = {
  2. 'url' : location.href,
  3. 'time' : second,
  4. 'refer' : getReferrer(),
  5. 'timeIn' : Date.parse(new Date()),
  6. 'timeOut' : Date.parse(new Date()) + (second * 1000)
  7. };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

定义一个JSON用来存储用户浏览数据,用户访问页面url、用户页面停留时间、用户来源页面、用户进入页面时间、用户离开页面时间。


  1. tjArr = eval('(' + tjArr + ')');
  2. tjArr.push(dataArr);
  3. tjArr= JSON.stringify(tjArr);
  4. localStorage.setItem("jsArr", tjArr);
  • 1
  • 2
  • 3
  • 4

数据解析和存储过程


用户刷新页面问题的解决

  1. if($.cookie('tjRefer') == ''){
  2. var tjT = eval('(' + localStorage.getItem("jsArr") + ')');
  3. if(tjT){
  4. tjT[tjT.length-1].time += second;
  5. var jsArr= JSON.stringify(tjT);
  6. localStorage.setItem("jsArr", jsArr);
  7. }
  8. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

用户刷新页面会导致我们的定时器重置,也就是说如果我们不处理的话,会再次记录这个页面的浏览记录(这是我们不希望看到的),于是我就想到 用刷新页面时 refer 信息为空来作为判断,我们去读取存到 cookie 中的 refer 信息作为判断条件。

如果用户刷新页面,我们就取出 最后一次 存入 localStorage 中的时间和本次的浏览时间相加,然后在更新最后一次存入的 localStorage 中。

整体代码的展示

  1. var second = 0;
  2. window.setInterval(function () {
  3. second ++;
  4. }, 1000);
  5. var tjArr = localStorage.getItem("jsArr") ? localStorage.getItem("jsArr") : '[{}]';
  6. $.cookie('tjRefer', getReferrer() ,{expires:1,path:'/'});
  7. window.onbeforeunload = function() {
  8. if($.cookie('tjRefer') == ''){
  9. var tjT = eval('(' + localStorage.getItem("jsArr") + ')');
  10. if(tjT){
  11. tjT[tjT.length-1].time += second;
  12. var jsArr= JSON.stringify(tjT);
  13. localStorage.setItem("jsArr", jsArr);
  14. }
  15. } else {
  16. var tjArr = localStorage.getItem("jsArr") ? localStorage.getItem("jsArr") : '[{}]';
  17. var dataArr = {
  18. 'url' : location.href,
  19. 'time' : second,
  20. 'refer' : getReferrer(),
  21. 'timeIn' : Date.parse(new Date()),
  22. 'timeOut' : Date.parse(new Date()) + (second * 1000)
  23. };
  24. tjArr = eval('(' + tjArr + ')');
  25. tjArr.push(dataArr);
  26. tjArr= JSON.stringify(tjArr);
  27. localStorage.setItem("jsArr", tjArr);
  28. }
  29. };
  30. function getReferrer() {
  31. var referrer = '';
  32. try {
  33. referrer = window.top.document.referrer;
  34. } catch(e) {
  35. if(window.parent) {
  36. try {
  37. referrer = window.parent.document.referrer;
  38. } catch(e2) {
  39. referrer = '';
  40. }
  41. }
  42. }
  43. if(referrer === '') {
  44. referrer = document.referrer;
  45. }
  46. return referrer;
  47. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

by weber开发者 from http://weber.pub/

本文地址: http://weber.pub/js记录用户行为浏览记录和停留时间/163.html

js记录用户在网站的浏览记录和停留时间的更多相关文章

  1. js操作Cookie,实现历史浏览记录

    /** * history_teacher.jsp中的js,最近浏览名师 * @version: 1.0 * @author: mingming */ $(function(){ getHistory ...

  2. jquery.cookie.js结合asp.net实现最近浏览记录

    一.html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  3. Java 利用监听器来实现记录用户访问网站次数

    假如有这么一个需求,要记录所有用户访问某一页面的次数. 最先想到的可能是在该Controller定义一个静态成员,然后在相应Action里自增.但这样有一个问题,就是Tomcat或者其他服务器重启的话 ...

  4. 用jsp的application写一个记录用户登陆网站的数量

    </head><body><%int i = 0;Object number = application.getAttribute("num");if ...

  5. js记录用户行为浏览记录和停留时间(转)

    演示地址:http://weber.pub/demo/160902/test.html 测试源码下载:http://pan.baidu.com/s/1nvPKbSP 密码:r147 解决问题所使用的知 ...

  6. js记录用户访问页面和停留时间

    1.setInterval setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval(code,millisec[,"lang" ...

  7. Cookie中图片的浏览记录与cookie读取servle时路径的设置(文字描述)

    public class ShowServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSer ...

  8. 会话技术之cookie(记录当前时间、浏览记录的记录和清除)

    cookie 会话技术: 当用户打开浏览器的时候,访问不同的资源,直到用户将浏览器关闭,可以认为这是一次会话. 作用: 因为http协议是一个无状态的协议,它不会记录上一次访问的内容.用户在访问过程中 ...

  9. position:搜索框显示历史浏览记录

    absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", "righ ...

随机推荐

  1. C#反射技术的相关使用方法

    1.获取同一程序集的类型实例 无参数构造函数 Type t=Type.GetType("AppCode.Employee"); object emp=t.Assembly.Crea ...

  2. hdu 4472 Count

    递推,一般的dp值: #include<stdio.h> #include<string.h> #define mod 1000000007 ]; int Dp() { a[] ...

  3. mysql模糊查询like/REGEXP

    原文:mysql模糊查询like/REGEXP 增删改查是mysql最基本的功能,而其中查是最频繁的操作,模糊查找是查询中非常常见的操作,于是模糊查找成了必修课. like模式 like意思是长得像, ...

  4. 【Spring开发】—— Spring Core

    原文:[Spring开发]-- Spring Core 前言 最近由于一些工作的需要,还有自己知识的匮乏再次翻开spring.正好整理了一下相关的知识,弥补了之前对spring的一些错误认知.这一次学 ...

  5. linux shell 命令学习(2) paste - merge lines of files

    paste - merge lines of files 命令格式: paste [OPTION] ... [FILE] ... 说明: 输出每个文件的对应行组合而成的行,中间用tab分开,如果没有F ...

  6. Echarts事件

    Echart饼图.柱状图.折线图(pie.bar.line)添加点击事件发布日期:2014年08月10日   来源:PHP1.CN     点击:250638摘要:var myChart= echar ...

  7. SQL语句 递归

    --正向递归查询(根据ID查到自己和自己以下的所有数据)   connect by prior a.id = a. parentid   --反向递归查询(根据叶子ID查出自己和自己以上的根数据)   ...

  8. Recover Binary Search Tree-恢复二叉查找树

    题目描述: 由于某种原因一个二叉排序树的两个节点的元素被交换,在不改变树的结构的情况下恢复这颗二叉排序树 题目来源: http://oj.leetcode.com/problems/recover-b ...

  9. C++:获取数组长度

    C/C++中如何获取数组的长度?   如何获取数组的长度 2010-12-15 20:49 C/C++中如何获取数组的长度? 收藏     C.C++中没有提供 直接获取数组长度的函数,对于存放字符串 ...

  10. Android--数据持久化之内部存储、Sdcard存储

    前言 之前一直在讲AndroidUI的内容,但是还没有完结,之后会慢慢补充.今天讲讲其他的,关于数据持久化的内容.对于一个应用程序而言,不可避免的要能够对数据进行存储,Android程序也不例外.而在 ...