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

4

总结:

我误解了内容脚本的使用方法,导致出现了这个问题。以下是来自谷歌官方文档的一段引用:

执行环境

内容脚本在一个被称为隔离世界的特殊环境中执行。它们可以访问注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数。对于每个内容脚本而言,在其运行的页面上似乎没有其他JavaScript正在执行。反之亦然:在页面上运行的JavaScript不能调用由内容脚本定义的任何函数或访问任何变量。

更多细节信息: Content Script tracking with Google Analytics

--

我正在将一些跟踪代码添加到Chrome扩展程序中。但当我进行测试时,_gaq.push返回数字3。经过测试,我发现如果我在扩展程序中调用_gaq.push,该数字将不断增加。但是,当我在控制台中调用它时,一切都正常(完全相同的代码)。

我想知道如何深入追踪这个错误?

非常感谢每一个回答!

更新:

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

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

我检查了DOM并发现已经添加了标签。

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

更新2:

我使用console.log跟踪“window._gaq”的值,并发现console.log(window._gaq)的返回值与直接在控制台中键入“window._gaq”不同。它们完全是两个不同的对象。我甚至使用了setInterval函数来记录结果,它仍然返回数组,而不是预期的对象。

1个回答

7
当在您的脚本中运行时,_gaq只是一个普通的数组。就像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

在 ga.js 文件加载完成后,会读取 _gaq 数组中的指令并进行处理,然后将 _gaq 数组替换为一个对象。该对象也实现了 push 函数。但请注意,在这种情况下,push 函数会将指令执行到 ga.js 库中,然后返回 0。
例如:
var _gaq = {
  push: function(){
    // Do something here
    return 0;
  }
};
> undefined
_gaq.push(['_trackPageview'])
> 0

这是一个非常聪明的谷歌设计,创建了一个API,即使在库(ga.js)加载之前也可以使用。
这就是为什么在您的脚本中,_gaq.push 是 Array 类的一个方法,并返回递增的数字,在控制台上总是返回 0。
这根本不是问题。它似乎按预期工作。
更新:
看起来 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);
  })();

它是异步加载的。因此,在执行此代码片段后,它将被加载,但加载的确切时间点是未知的。

如果您需要知道何时加载ga.js文件,则可以将回调推入_gaq中,当ga.js文件加载时,它将被执行。

例如:

_gaq.push(function(){
  console.log('ga.js loaded!');
  debugger;
});

非常感谢您的解释。我添加了一个新的跟踪代码,并发现当我跟踪_gaq的返回值时,它仍然是一个数组。这意味着ga.js仍未加载。但问题是,除非我使用console.log来跟踪_gaq,否则它从未在我的脚本中加载。这很奇怪。我已经更新了我的问题。 - AGamePlayer
@AwQiruiGuo 我更新了我的回答,但你最好更好地解释一下你想要调试什么。只需检查gif请求是否被发送,如果发送了,则表示它正在工作。 - Eduardo
谢谢您的快速回复!我检查了一下,任务并没有被发送。我最终发现这可能是Chrome扩展脚本有效范围的问题。我从扩展内容脚本中定义的对象无法直接从控制台面板中访问。也许这不是GA的问题,而是Chrome的问题。您有什么好的建议吗? - AGamePlayer
不应该将Google Analytics跟踪代码注入到内容脚本中。您正在运行可能受页面上的代码影响的代码。最好从内容脚本向后台脚本发送消息以执行跟踪,然后从后台页面进行跟踪。 - Eduardo
谢谢Eduardo!我会去看看的。你的回答帮了我很多! :) - AGamePlayer
还有一些麻烦:( 你能看一下这个吗: https://dev59.com/xmcs5IYBdhLWcg3wRB7h - AGamePlayer

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