【发布时间】:2015-02-23 07:39:13
【问题描述】:
我想跟踪经过身份验证的用户在我的网站上花费的时间。
为此,我已将此代码放在我的布局中:
function js_yyyy_mm_dd_hh_mm_ss (param) {
now = new Date(param);
year = "" + now.getFullYear();
month = "" + (now.getMonth() + 1); if (month.length == 1) { month = "0" + month; }
day = "" + now.getDate(); if (day.length == 1) { day = "0" + day; }
hour = "" + now.getHours(); if (hour.length == 1) { hour = "0" + hour; }
minute = "" + now.getMinutes(); if (minute.length == 1) { minute = "0" + minute; }
second = "" + now.getSeconds(); if (second.length == 1) { second = "0" + second; }
return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
}
var start;
$(document).ready(function() {
var d = new Date();
start = d.getTime();
});
<% if current_user %>
$(window).on('beforeunload', function() {
var d = new Date();
end = d.getTime();
timeSpent = (end-start)/1000;
page = window.location.toString();
debut=js_yyyy_mm_dd_hh_mm_ss(start);
fin=js_yyyy_mm_dd_hh_mm_ss(end);
$.ajax('<%= users_time_path %>', {
async: false,
type: 'POST',
data: {log_time:{start:debut, end: fin, timespent: timeSpent, page:page}},
success: function(res,status) { },
error: function (res, status) {
console.log('Server error: '+ status);
}
});
<% end %>
});
但是如果用户打开了两个标签页,那么使用这段代码我会计算两次。
此外,如果用户在打开选项卡的情况下离开这台计算机并在两天后回来,我将计算超过 48 小时...
我应该怎么做才能避免这种情况?
我怎样才能在服务器端避免用户假时间?
谢谢
【问题讨论】:
-
如何使用谷歌分析来实现这些跟踪功能
-
您可以在选项卡模糊时向您的服务器发送 ping,然后您可以将其视为关闭选项卡。除了最后一页,总时间是页面服务之间所用时间的总和......
-
@dandavis 我在下面添加了一个答案,它通过 JS 库本地执行此操作,用于处理页面模糊/卸载/页面隐藏事件等事件。