【问题标题】:How to tell how long each user visits each page?如何判断每个用户访问每个页面的时间?
【发布时间】:2013-04-09 08:58:16
【问题描述】:

有没有一种好方法可以准确地判断给定用户在 Web 应用程序的给定页面上花费了多长时间,准确度约为一分钟?

我想到的一个解决方案是使用 Javascript 每分钟点击一次 Web 服务,并跟踪数据库中的点击量。但我想知道是否有更好的方法......有没有办法通过谷歌分析来完成这个?如果有,怎么做?

【问题讨论】:

  • 我想这样的指标不会来自页面本身,而是来自请求页面的时间与请求下一页的时间的比较(可以完全在服务器端完成) . (假设如果没有后续页面被请求,那么它就是一个被放弃的会话。)
  • 谷歌分析可能是要走的路。特别是在页面分析中

标签: javascript web-applications web google-analytics google-analytics-api


【解决方案1】:

对于那些感兴趣的人,我已经在一个小型 JavaScript 库和服务中做了一些工作,以计算用户与网页交互的时间。它实际上完全符合 Chase 在他/她的回答中所描述的!然而,它还有一个额外的好处,那就是更准确(虽然不是很完美)跟踪用户实际与页面交互的时间。它忽略用户切换到不同选项卡、空闲、最小化浏览器等的时间。

编辑:我已更新示例以包含当前 API 使用情况。

http://timemejs.com

其用法示例:

包含在您的页面中:

<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>

如果您想自己向后端报告时间:

window.onbeforeunload = function(){
    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);
});

TimeMe.js 还支持通过 websockets 发送计时数据,因此您不必尝试将完全同步的 http 请求强制到 document.onbeforeunload 事件中。

【讨论】:

    【解决方案2】:

    首先,我同意 cmets 关于分析软件的看法,您绝对应该调查他们的这种性质。

    我不知道这会有多好,我绝对不相信这是最好的方法,但如果你死心塌地做这个客户端,你也许可以尝试这样的事情:

    var start = new Date().getTime();
    
    window.onbeforeunload = function(){
        var end = new Date().getTime();
        alert( parseInt(end - start, 10)/60000 + " minutes" );
    };
    

    这里的想法是在用户访问您的页面后保存当前时间。一旦他们离开,onbeforeunload 事件应该触发并运行函数来计算他们在页面上花费的时间。我想你可以在 一个 ajax 调用(或其他东西) 中添加一个 同步调用 以在某处节省总时间。

    EXAMPLE

    注意:jsfiddle 会阻止这些事件,但你仍然可以通过打开控制台在错误日志中看到输出。打开控制台后,只需点击 Run 即可触发事件。

    编辑

    请参阅下面@Ian 的cmets,了解在onbeforeunload 事件中使用AJAX 请求。

    【讨论】:

    • beforeunload 事件中的 AJAX 请求不是跨浏览器一致的,帮助它们的最佳/唯一方法是使用 同步 请求。离开页面时,浏览器会中止打开的 AJAX 请求。因此,当您在 unload 事件之前的 beforeunload 事件中启动一个请求时,很有可能该请求在其生命周期中无法到达服务器
    • 感谢@Ian 指出这一点,就像我在上面所说的那样......我不太确定它的效果如何。不过你是完全正确的,它们需要是同步的。
    • 我知道,我只是想解释一下可能发生的事情 :) 对我来说,像 OP 要求的东西只需要与服务器通信。服务器不应该响应。因此,如果 AJAX 请求可以在被浏览器中止时离开浏览器(这只是意味着浏览器不会处理其响应),那么这应该很好。在我从事的一个项目中,我们在beforeunload 中发送了一个 AJAX 请求,我们需要它是同步的。可能有帮助的方法是设置一个超时时间(我们做了 1000 毫秒),比如 jQuery $.ajax 允许。
    • 抱歉措辞 - 它仍然是一个 AJAX 请求,但是是一个同步请求(.open 方法中的第三个参数将是 false
    • 我实际上从来没有遇到过需要在 onbeforeunload 事件中使用任何一个的情况,所以整个想法起初有点猜测,因为我没有实际测试过它。再次,我非常感谢您指出!我将在帖子中添加一点评论以查看您的 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多