2011-10-28 73 views
1

我的许多事件(可能是20%)都没有记录在Google Analytics中。这些都是通过在发布表单的图像按钮上进行onclick调用的所有事件。我相信代码运行速度不够快,无法在浏览器移动到下一页之前将事件提交给Google。避免Google Analytics异步跟踪中的竞争条件

我想要做的是检查_gaq队列的状态,并确保在完成我的Javascript之前没有未决事件。

_gaq对我来说似乎有点神秘,但它确实有一个暴露的属性 - 你。我已经在Chrome一直在测试用一个简单的命令:

console.log(_gaq.u); 

不幸的是,这总是返回0,即使_gaq.push命令后立即运行。当然,Chrome似乎总是在事件发生之前将事件发送给Google,所以我不确定我是否可以在Chrome中进行调试,因为我无法复制该问题。

有谁知道是否有办法从_gaq获取队列中未决项目的计数? _gaq.u是否合适?我想要做一些比在所有事件上投入100或200毫秒等待更优雅的事情。

回答

4

_gaq有2个阶段。

首先,当它的一个数组,在ga.js加载之前,它的一个函数名称或它们的参数或实际函数的队列。

然后,当加载ga.js时,它被转换成一个特殊的对象,队列被处理(函数被调用),所有后续的调用立即执行它们传递的内容。

当它仍然是一个队列时,_gaq只是一个正常的JavaScript数组。因此,您可以使用_gaq.length访问等待处理的项目数量。一旦队列被处理,队列就没有办法了。

onclick竞赛状况问题是常见的问题。许多人喜欢通过阻止默认操作,完成事件跟踪,然后设置完成原始操作的短时间段setTimeout来避开它。

我的选择是不损害用户体验,只是为了分析(我做这行吃饭。)所以,我的解决方案是使用onmousedownonkeydown的替代品(合我称它们为preclick,它消除了。比赛条件,只有最小的误报,这对于网络分析不够好,这大约是近似模型,没有科学性,准确性

下面是jQuery的一个例子:

$.fn.preclick = function(param) { 
    if (!param) { 
     return this.trigger("mousedown"); 
    } 
    return this.one("keydown.preclick mousedown.preclick", function(e) { 
     if (e.type === "mousedown" || e.which === 13) { 
      param.apply(this); 
     } 
    }); 
}; 
+0

我使用同步代码试图避免这种情况我正在使用异步代码进行页面跟踪,但按钮点击发生的所有事件均使用同步版本进行编码。 我在Chrome中测试了它,它工作正常(尽管使用_getTracker时不断弃用警告)。部署它并运行几天导致行为绝对没有变化 - 20-25%的事件没有被捕获。 任何想法为什么同步代码不能解决这个问题?我还没有做过分析,看看是否存在特定于浏览器的问题。 – bkgraham

+0

另外,yahelc,你有没有测试过你的'onmousedown'和'onkeydown'事件,尤其是iPad? – bkgraham

+0

@bkgraham是的。查看Apple的文档;它工作正常http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html – Yahel