0

我想跟踪访问者阅读页面的时间。如果他们关闭标签或最小化窗口,则在他们再次查看标签之前,时间不应计入页面上的时间。

我认为 javascript 和服务器端工作的某种组合将是必要的。

我正在努力解决的几个问题:

  1. 将此信息存储在数据库中的最佳方式是什么?
  2. 我如何使用 Javascript 以合理的准确度捕获页面上的时间?我是否存储“页面加载”、“用户空闲”、“用户返回”、“页面卸载”等事件,然后单独处理数据库中的所有事件以得出页面时间?
4

2 回答 2

4

我在一个小型 JavaScript 库中做了一些工作,该库可以计算用户在网页上停留的时间。它还有一个额外的好处,那就是更准确(虽然不是很完美)跟踪用户实际与页面交互的时间。它忽略了用户切换到不同选项卡、闲置、最小化浏览器等的时间。建议的谷歌分析方法有一个缺点(据我了解),它仅在您的域处理新请求时检查。它将先前的请求时间与新的请求时间进行比较,并将其称为“在您的网页上花费的时间”。它实际上并不知道是否有人正在查看您的页面,是否已最小化浏览器,自上次加载您的页面后是否已将选项卡切换到 3 个不同的网页等。

https://github.com/jasonzissman/TimeMe.js

其用法示例:

在加载您的页面时:

document.onload = function() {
  TimeMe.setIdleDurationInSeconds(30);
  TimeMe.setCurrentPageName("my-home-page");
  TimeMe.initialize();  
}

检索在页面上花费的时间,并在用户离开您的页面时将其发送到您的服务器:

window.onbeforeunload = function (event) {
    xmlhttp=new XMLHttpRequest();
    xmlhttp.open("POST","ENTER_URL_HERE",false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    var timeSpentOnPage = TimeMe.getTimeOnCurrentPageInSeconds();
    xmlhttp.send(timeSpentOnPage);
};
于 2015-02-04T01:25:43.870 回答
0

首先,您需要检测用户何时离开选项卡或处于非活动状态。发生这种情况时,启动计时器,当他们回来时,停止计时器。由于阻塞,使用 setTimeout/setInterval 计算时间可能不准确,因此我根据日期时间的实际差异为自己制作了一个准确的 javascript 计时器:https ://gist.github.com/4600726

所以你的代码看起来像这样:

timer = new Timer;

window.addEventListener('focus', function() {
    timer.start();
}, false);

window.addEventListener('blur', function() {
    timer.stop();
    // send timer.msecs() to the server maybe??
    // if so, also call timer.reset();
}, false);

window.addEventListener('beforeunload', function() {
    timer.stop();
    // send timer.msecs() to the server via jquery post, or better yet websocket
}, false);

然后您可以使用 timer.secs() 获取经过的时间。我想这取决于您希望向服务器发送信息的频率。你可以在模糊上做到这一点。

另一种选择可能是规定没有鼠标悬停意味着不活动。启动计时器,然后执行 setTimeout,然后在窗口的 mousemove 事件上取消 setTimeout 并启动另一个 setTimeout,然后停止计时器。

至于将数据发送到服务器,我可能会选择在模糊上发送它,当然还有在卸载之前发送。我首选的方法是使用socket.io,因为它速度快且始终连接,因此您可以使用它来实时跟踪大量用户事件,但您可以只对服务器进行 ajax 调用。如果您只是将它们作为迷你用户会话发送,{ user: userId , page: pageId , elapsedTime: msecs } 那么您可以在进行分析时在服务器端聚合数据。

于 2013-01-23T01:13:21.743 回答