避免Google Analytics异步跟踪中的竞争条件

时间:2011-10-28 13:25:26

标签: javascript google-analytics

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

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

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

console.log(_gaq.u);

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

有没有人知道是否有办法从_gaq获取队列中待处理项目的数量? _gaq.u是适当的属性吗?我想做一些比在我的所有活动中等待100或200毫秒等待更优雅的事情。

1 个答案:

答案 0 :(得分:4)

_gaq有两个阶段。

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

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

当它仍然是队列时,_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);
        }
    });
};