繁体   English   中英

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

[英]Avoiding race conditions in Google Analytics asynchronous tracking

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

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

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

console.log(_gaq.u);

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

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

_gaq有两个阶段。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM