检查Google Analytics的_gaq对象是否已加载并可用。

8
我网站上有一些Google Analytics Tracking Code (GATC),它会触发调用Google代码中的_gaq.push方法。如果GA不可用或_gaq未加载,我希望确保页面上没有任何JavaScript错误。通过检查_gaq是否不等于“undefined”来判断它是否可用,这样做是否足够并且是否跨浏览器?我看了一下Google的文档,但它没有提到这方面的内容。我知道检查对象是否为null,但我不确定是否有必要。
if (typeof(_gaq) !== 'undefined') {
   _gaq.push(['_trackEvent', 'Downloaded Video', 'Yes']); 
   _gaq.push(['rollup._trackEvent', 'Downloaded Video', 'Yes']);                                    
}
6个回答

50

如果您使用的是Universal Analytics(analytics.js),则切换到:

_gaq.push(['_trackEvent', 'Downloaded Video', 'Yes']); 

到这个:

ga('send', 'event', 'Downloaded Video', 'Yes');

1
@Mr.Hardy 我没有使用通用分析,所以我不能接受这个作为正确答案。 - crmpicco
该参考文档建议第三个参数是一个对象,并且没有第四个参数。 - AsTeR
以上代码只对我有效:ga('send', { 'hitType': 'event', // 必填项。 'eventCategory': 'button', // 必填项。 'eventAction': 'click', // 必填项。 'eventLabel': 'nav buttons', 'eventValue': 4 });但是看起来你可以像这样传递一个字符串:ga("send","event"....但这对我不起作用... - landed

18

在从分析工具获取的推荐 JavaScript 代码中,包含以下行:

var _gaq = _gaq || [];
因此,如果您在代码中保留此行,则数组应始终可用。 如果您稍后添加分析代码,请在主脚本之前添加上述行,它将起作用。
请注意,即使您之前已定义了 _gaq ,此片段也是无害的,因为只有在先前未定义时才将其定义为新数组。
这是使用异步脚本的好方法,首先在本地定义数组,然后在需要时将命令推送到该数组中。 当分析脚本加载时,可以在需要时使用这些命令。 因此,不需要检查数组是否未定义或类似的任何内容。

1
我不想重新定义 _gaq 变量,因为我已经在 Google 提供的代码中设置了它。我在自己的代码中有推送调用。重新定义 _gaq 似乎有风险。 - crmpicco
3
我不是说你应该重新定义它。我的意思是,如果你按照文档所说已经添加了它,你就不能再检查未定义了 - 也不需要检查。 - David Hellsing

3
当加载ga.js时,它会定义一个全局对象window._gat(注意T而不是Q),您只需要测试它是否被定义(但要注意它是异步加载的,因此您可能需要延迟测试)。

3
一般情况下,您不需要检查是否已定义,因为Google Analytics代码片段会为您执行此操作。但是,如果您在站点的其他部分中进行事件跟踪(如问题所示),有时检查脚本是否已加载是很好的选择,因为它是异步的。
我编写了一个jQuery插件包装器,想要在代码中检查GA是否已安装,然后再尝试向其推送任何数据。这是为了覆盖某些人在未安装GA或在GA初始化之前尝试使用插件的情况。
if (typeof(_gaq) == 'undefined') {
  console.error("Google Analytics is not installed");
}

2
这对我来说是正确的答案。因此,我们仅在生产站点上呈现跟踪脚本(谷歌加其他),因此在开发/ UAT中_gaq未定义。这很完美地运作。谢谢 - Jag
_gaq是由跟踪代码片段创建的,而不是在ga.js加载时创建的。这还不够。请参见https://dev59.com/ZmrXa4cB1Zd3GeqPEO95#13450713。 - Open SEO

1

正如@David所说,只要您之前定义了var _gaq = _gaq || [];代码片段,就没有必要检查_gaq是否未定义。

如果之前未定义_gaq,则将其定义为空数组的原因是为了使其具有push方法。这允许您的分析代码在GA代码加载之前执行,或在某些情况下当GA不可用时执行。

当GA加载时,_gaq将被重新定义为具有push方法的对象,并且旧的_gaq数组中的任何现有内容都将被执行。


0

你可能想在JS中的某个地方添加事件跟踪,但CMS仅为非登录访问者或特定页面添加Google Analytics。以下函数检查将起作用:

if (typeof(ga) === 'function') {
  ga('send', 'event', 'what', 'has', 'happened');
}

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