我想跟踪访问者阅读页面的时间。如果他们关闭标签或最小化窗口,则在他们再次查看标签之前,时间不应计入页面上的时间。
我认为 javascript 和服务器端工作的某种组合将是必要的。
我正在努力解决的几个问题:
- 将此信息存储在数据库中的最佳方式是什么?
- 我如何使用 Javascript 以合理的准确度捕获页面上的时间?我是否存储“页面加载”、“用户空闲”、“用户返回”、“页面卸载”等事件,然后单独处理数据库中的所有事件以得出页面时间?
我想跟踪访问者阅读页面的时间。如果他们关闭标签或最小化窗口,则在他们再次查看标签之前,时间不应计入页面上的时间。
我认为 javascript 和服务器端工作的某种组合将是必要的。
我正在努力解决的几个问题:
我在一个小型 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);
};
首先,您需要检测用户何时离开选项卡或处于非活动状态。发生这种情况时,启动计时器,当他们回来时,停止计时器。由于阻塞,使用 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 } 那么您可以在进行分析时在服务器端聚合数据。