4

总结:

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

执行环境

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

更多详细信息: 使用 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 函数来记录结果,它一直返回数组,而不是预期的对象。

4

1 回答 1

7

当你的脚本运行时_gaq只是一个普通的数组。就像 JavaScript 中的任何 Array 一样,它具有向 Array 中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 函数将执行 ga.js 库中的指令,然后返回 0。

例如:

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

这是一个非常聪明的 Google 设计,它创建了一个 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;
});
于 2012-10-20T02:23:15.757 回答