总结:
我误解了内容脚本的用法。这导致了这个问题。以下是Google官方文档的引用:
执行环境
内容脚本在称为隔离的特殊环境中执行 世界。他们可以访问他们注入的页面的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对象?
UPDATE2:
我使用console.log来跟踪" window._gaq"的值。并发现console.log(window._gaq)的返回值与直接输入" window._gaq"相比是不同的。在控制台中。它完全是两个不同的对象。我甚至使用setInterval函数来记录结果,并且它不断返回数组,而不是预期的对象。
答案 0 :(得分: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
这是一个非常聪明的Google设计,可以创建一个甚至可以在加载库(ga.js)之前使用的API。
这就是为什么在你的脚本_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;
});