我有这个要求:
系统将记录用户显示每页的时间长度。
虽然在富客户端应用程序中微不足道,但我不知道人们通常会如何跟踪这一点。
编辑:John Hartsock
我一直对此感到好奇,在我看来,通过使用document.onunload事件可以实现这一点,可以准确地捕捉星星并停止所有页面的停留时间。基本上只要用户停留在您的网站上,您就可以始终获得除最后一页之外的每个页面的开始和停止时间。这是场景。
问题变成是否可以跟踪用户何时关闭窗口或导航离开您的网站?是否可以使用onunload事件?如果没有,那么还有什么其他可能性呢?很明显,AJAX将是一条路线,但其他一些路线是什么?
答案 0 :(得分:5)
我认为您无法捕获每一页的观看次数,但我认为您可能能够捕获足够的信息,以便分析网站使用情况。
创建一个包含以下列的数据库表:网页名称,用户名,开始时间和结束时间。
在页面加载时,将记录插入包含前三个字段数据的表中。返回该记录的ID以备将来使用。
在任何导航上,使用之前返回的ID更新导航事件处理程序中的记录。
与开始和结束时间的记录相比,开始时间最多会有更多记录。但是,您可以从这个简单的数据中进行这些分析:
由于某些网页比其他网页更频繁地被放弃,您的数据可能会被扭曲。
但是,您当然可以尝试捕获此数据并查看其显示的合理程度。有时候在现实世界中,我们必须用不完美的信息来弥补。但这可能已经足够了。
编辑:这些方法中的任何一种都可能满足您的需求。
1)这是 Ajax解决方案的HTML部分。它来自this page,其中包含用于在文本文件中记录信息的PHP代码 - 如果您愿意,可以轻松更改为写入数据库。
<html>
<head>
<title>Duration Logging Demo</title>
<script type=”text/javascript”>
var oRequest;
var tstart = new Date();
// ooooo, ajax. ooooooo …
if(window.XMLHttpRequest)
oRequest = new XMLHttpRequest();
else if(window.ActiveXObject)
oRequest = new ActiveXObject(“Microsoft.XMLHTTP”);
function sendAReq(sendStr)
// a generic function to send away any data to the server
// specifically ‘logtimefile.php’ in this case
{
oRequest.open(“POST”, “logtimefile.php”, true); //this is where the stuff is going
oRequest.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
oRequest.send(sendStr);
}
function calcTime()
{
var tend = new Date();
var totTime = (tend.getTime() – tstart.getTime())/1000;
msg = “[URL:" location.href "] Time Spent: ” totTime ” seconds”;
sendAReq(‘tmsg=’ msg);
}
</script>
</head>
<body onbeforeunload=”javascript:calcTime();”>
Hi, navigate away from this page or Refresh this page to find the time you spent seeing
this page in a log file in the server.
</body>
</html>
2)Another fellow建议在Page_Load
中创建计时器。在那时写下初始数据库记录。然后,在计时器的Elapsed
事件上,更新该记录。在onbeforeunload
进行最后更新。然后,如果由于某种原因你错过了最后一次onbeforeunload
事件,那么至少你会记录用户在页面上花费的大部分时间(取决于计时器Interval
)。当然,如果您每秒更新一次并且拥有数百或数千个并发用户,则此解决方案将相对耗费资源。因此,您可以对其进行配置,以便为应用程序打开和关闭此功能。
答案 1 :(得分:2)
这必须使用一些javascript来完成。正如另一方所说,它并不完全可靠。但是你应该能够获得足够的准确数据。
这需要在卸载页面时从javascript代码调用您的服务器。挂钩的javascript事件是window.unload。或者您可以使用更好的API,例如jQuery。或者您可以使用现成的解决方案,例如WebTrends或Google Analytics。我认为两者都记录了页面显示的时间长度。
良好的网络分析非常困难。如果你必须管理大量的流量,那就变得更难了。您应该尝试找到现有的解决方案而不是重新发明自己的解决方案......
答案 2 :(得分:2)
我已将一些工作放入一个小型JavaScript库中,该库会计算用户在网页上的时长。它具有更准确(但并不完美)跟踪用户实际与页面交互的时间的额外好处。它忽略了用户切换到不同标签,闲置,最小化浏览器等的时间。建议的Google Analytics方法有缺点(据我所知),它只检查您的域处理新请求的时间。它将之前的请求时间与新的请求时间进行比较,并调用“您在网页上花费的时间”#39;。它实际上并不知道是否有人正在查看您的页面,最小化浏览器,将标签切换到自上次加载页面以来的3个不同的网页等。
正如其他人提到的那样,没有任何解决方案是完美的。但希望这个也能提供价值。
编辑:我已更新示例以包含当前的API使用情况。
其用法示例:
包含在您的信息页中:
<script src="http://timemejs.com/timeme.min.js"></script>
<script type="text/javascript">
TimeMe.initialize({
currentPageName: "home-page", // page name
idleTimeoutInSeconds: 15 // time before user considered idle
});
</script>
如果您想自己向后端报告时间:
xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","ENTER_URL_HERE",true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var timeSpentOnPage = TimeMe.getTimeOnCurrentPageInSeconds();
xmlhttp.send(timeSpentOnPage);
TimeMe.js还支持通过websockets发送计时数据,因此您不必尝试强制完整的http请求进入document.onbeforeunload
事件。
答案 3 :(得分:1)
在基于Web的系统中,没有办法可靠地执行此操作。当然,您可以记录用户显示的每个页面,并记录每个视图之间的时间长度,但是当他们在显示的最后一页上关闭浏览器时会发生什么?这只是这个要求的几十个问题之一。
答案 4 :(得分:1)
基于AJAX的方法怎么样?它只适用于Javascript在客户端,但每隔15秒向某个脚本发送一个POST将获得合理的粒度。
还有更复杂的“反向AJAX”事情你可以做...但我对它们知之甚少。
答案 5 :(得分:1)
您可以使用onunload来执行您需要的操作。让它向您的服务器发送AJAX请求以更新数据库。你可能想要返回false然后在AJAX请求完成后再执行document.close,这样它就不会过早退出并且不会丢弃ajax。
在数据库中,您只想存储页面,IP地址,事件发生的时间,以及它是onload还是onunload事件。
这就是它的全部。
答案 6 :(得分:0)
我最近举了一个记录html页面花费时间的示例。 刷新不会中断录制,而关闭会
我使用sessionStorage来解决该页面花费的“时间” 如果刷新 我将其放入sessionStorage 如果关闭 我无法从sessionSotrage获得它,所以我将时间设置为= 0
这是我的代码
`
<body>
time spent :<div id="txt"></div>
</body>
<script>
$(function () {
statisticsStay();
})
function statisticsStay(){
var second=0;
if(sessionStorage.getItem('testSecond')!=null)
second=sessionStorage.getItem('testSecond');
var timer = setInterval(function(){
second++;
document.getElementById('txt').innerHTML=second;
},1000);
window.onbeforeunload = function(){
sessionStorage.setItem('testSecond',second);
};
}
</script>
`