如何调试Google Analytics跟踪错误(_gaq.push返回'3')

AGa*_*yer 4 google-analytics google-analytics-api

总结:

我误解了内容脚本的用法.这导致了这个问题.以下是Google官方文档的引用:

执行环境

内容脚本在称为孤立世界的特殊环境中执行.他们可以访问注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数.它将每个内容脚本视为在其运行的页面上没有执行其他JavaScript.反过来也是如此:页面上运行的JavaScript无法调用任何函数或访问内容脚本定义的任何变量.

更多详细信息: 使用Google Analytics跟踪内容脚本

-

我在Chrome扩展程序中添加了一些跟踪代码.但是当我测试它时,_gaq.push返回数字3.正如我测试的那样,我想如果我在扩展中调用_gaq.push,数字将继续上升.但是当我在控制台中调用它时,一切都很好(所有相同的代码).

我想知道如何更深入地跟踪此错误?

非常感谢每一个答案!

更新:

当我追踪_gaq的返回值时,它仍然是一个数组.这意味着没有加载ga.js,对吧?

但似乎ga.js永远不会加载到我的脚本中.除非我在控制台中手动输入_gaq,否则它就是一个对象.这很奇怪.

我检查了DOM,发现标签已经添加.

我查看了"网络"面板,发现队列中根本没有加载ga.js.但为什么我仍然可以使用控制台来访问_gaq对象?

UPDATE2:

我使用console.log来跟踪"window._gaq"的值,发现console.log(window._gaq)的返回值与在控制台中直接输入"window._gaq"不同.这完全是两个不同的对象.我甚至使用setInterval函数来记录结果,并且它保持返回数组,而不是预期的对象.

Edu*_*rdo 7

当你的脚本运行时,_gaqjut是一个常规的数组.就像JavaScript中的任何数组一样,它有一个方法push可以将一个或多个元素插入到数组中并返回数组的最终长度.

例如:

var _gaq = [];
> undefined
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
> 1
_gaq.push(['_setDomainName', 'mysite.com']);
> 2
_gaq.push(['_trackPageview'], 
          ['_trackEvent', 'cat', 'act']);
> 4
Run Code Online (Sandbox Code Playgroud)

加载ga.js文件后,将_gaq读取Array,以便处理推入其中的指令,然后_gaq使用对象替换Array.该对象也实现了push函数.但请注意,在这种情况下,push函数将执行ga.js库中的指令,然后返回0.

例如:

var _gaq = {
  push: function(){
    // Do something here
    return 0;
  }
};
> undefined
_gaq.push(['_trackPageview'])
> 0
Run Code Online (Sandbox Code Playgroud)

这是一个非常聪明的Google设计,可以创建一个甚至可以在加载库(ga.js)之前使用的API.

这就是为什么在你的脚本中_gaq.push是一个Array类的方法并返回增加的数字,并且在控制台上它总是返回0.

这根本不是问题.它似乎按预期工作.

UPDATE

看来ga.js已经加载了.也许它被缓存而没有在网络面板上显示.

ga.js由跟踪脚本的这一部分加载:

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
Run Code Online (Sandbox Code Playgroud)

它是异步加载的.因此,在执行此代码段之后,它将被加载,但加载它的确切位置是未知的.

如果您需要知道加载ga.js文件的时间,可以将回调推送到_gaq,并在加载ga.js文件时执行.

例如:

_gaq.push(function(){
  console.log('ga.js loaded!');
  debugger;
});
Run Code Online (Sandbox Code Playgroud)