Google Analytics 事件 - 何时发送?

4
我的“应用程序”是一个单独的网页(myPage.html),在Google地图上显示物品。因此,用户不需要在多个页面之间导航。
因此,我使用事件来跟踪交互。然而,我发现很难相信我在统计数据中看到的结果。
我已经检查了事件的语法,看起来没有问题。
 _gaq.push(['_trackEvent', 'MyApp', 'ChangeTav', newTab]);
 _gaq.push(['_trackEvent', 'MyApp', 'Load', 'itemType', loadTime]);
 ....

我想知道如何向_gaq对象添加数组,但这些数组何时被发送?用户关闭浏览器会发生什么?我是否可以“强制”发送这些值?
反过来,如果用户停留在页面上一段时间,那么值将被添加到_gaq中,但我如何确保它们不会丢失?
--更新--
使用push方法,我只需将一个数组添加到另一个数组中,或者这样做是错误的?所以在这个特定的时刻什么都不会发生,我没有看到任何回调或重写的方法。如果我漏掉了什么,请纠正我。
--更新2--

http://code.google.com/apis/analytics/docs/tracking/asyncUsageGuide.html

似乎使用同步或异步方式有所不同。对于异步(我正在使用的)...
将API调用推入队列中,必须将其从传统的JavaScript语法转换为命令数组。命令数组只是符合某种格式的JavaScript数组。命令数组中的第一个元素是要调用的跟踪器对象方法的名称。它必须是字符串。其余的元素是要传递给跟踪器对象方法的参数。这些可以是任何JavaScript值。
当我使用var _gaq = _gaq || [];进行初始化时,它变成了一个数组。然而,我从未看到队列(_gaq)中的值被删除,因此我认为它们从未被发送。
---好的,我们开始吧---

http://code.google.com/apis/analytics/docs/gaJS/gaJSApi_gaq.html#_gaq.push

这个函数被命名为push,以便在Analytics完全加载之前可以使用数组来代替_gaq。当Analytics正在加载时,命令将被推送/排队到数组中。当Analytics完成加载时,它会用_gaq对象替换数组并执行所有排队的命令。对_gaq.push的后续调用解析为此函数,该函数在推送命令时执行它们。

你的编辑是正确的答案,而不是你已经接受的答案。你应该将它们作为答案发布并接受。 - Yahel
我的印象是这其实是正确的,它们是在 _gaq 初始化(成为一个对象)时发送的,这取决于初始化代码位置和调试时间。只是一开始我没有理解,因为我总是在我的调试器中看到一个数组。通过你的讨论,我更加专注于这个主题,并深入了解了它,没有你的回答我可能会错过它!谢谢。 - Horst Walter
ysrb的回答并没有错,只是不如你的回答完整和准确。 (我没有发布答案,但你应该将你的编辑作为答案发布。) - Yahel
2个回答

1

我相信,只要_gaq已经初始化,它就会在调用时立即发送。这取决于您放置GA init代码的位置。


他们是如何做到的,我的意思是我只是简单地将一个数组添加到另一个数组中吗?或者这样做是错误的吗?我在调试器中没有看到他们重写push方法或其他什么。 - Horst Walter
如果你使用firebug插件,就会有一个Net选项卡,可以显示后台发送的任何数据。所以_gaq.push函数将在Net选项卡上触发某些操作。试试看吧。 - ysrb
2
是的,没错,我的错误,_gaq首先是一个数组,当GA被初始化后,它变成了一个带有push方法的对象。因此,在调试时,它是作为数组还是作为带有“现有”push方法的对象取决于时间/情况... - Horst Walter

0

你所提到的.push方法仅适用于数组。对于对象,你可以自定义它,而不会覆盖任何内容。

在JavaScript中,数组不能具有自定义索引/标签,如果有,则它们是对象。

如果运行

var a= {"a":"b"};
var b  = ['a','b'];

b.push("c");
a.push("c","d");

你会收到一个错误,函数a.push未定义。 a是一个对象,b是一个数组。push函数只存在于Array的原型中。

要观察何时跟踪这些内容,您可以使用Firebug中的Net面板,并检查是否请求了_utm.gif文件。


Firebug的想法很好。但是,仅供我理解,也许我有点困惑。_gaq.push(['_trackEvent', 'MyApp', 'ChangeTav', newTab]); _gaq是一个数组,而我所推送的也是一个数组,对吗?这意味着 - 总之 - 除非被覆盖,否则在push中不能进行“发送”。 - Horst Walter
不,_gaq是一个具有自定义函数.push的对象(而不是数组)。我需要检查ga.js才能告诉您它确切的作用,但我最好的猜测是它被混淆和压缩了,所以... - alinn
此外,我最好的猜测是,在_gaq对象中确实有一个数组作为属性,其中真正进行推送的是这个数组,但动作本身是在对象_gaq中定义的。 - alinn
1
似乎在使用同步/异步时有所不同(请参见我上面的更新)。在我的调试器(VS2010)中,我看到它是一个数组,而在FF中我看到它是一个对象。非常令人困惑......顺便说一句,感谢您的努力。 - Horst Walter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接