我正在开发一个项目,该项目会在Google Analytics自定义变量中存储一些信息。我正在构建的脚本需要检测GA是否已经加载,然后才能将数据推送到它。该项目旨在适用于使用GA的任何类型的网站。问题是可靠地检测GA是否已完成加载并且可用。
这里有几个变化:
有多种加载GA的方法。从Urchin开始的旧脚本到最新的异步脚本。其中一些是内联的,一些是异步的。此外,有些网站会像我工作那样自定义加载GA的方法。我们使用YUI getScript加载它。
变量名称。在某些脚本中,分配给GA的变量名称为pageTracker
。在其他人中,_gaq
。然后是网站可用于实现GA的自定义变量名称的无限。
那么,是否有人对可能检查Google Analytics是否在页面上使用以及是否已加载的可靠方法有任何疑问?
答案 0 :(得分:32)
这样,您可以将代码置于之前 Google Analytics跟踪代码:
function check_ga() {
if (typeof ga === 'function') {
console.log('Loaded :'+ ga);
} else {
console.log('Not loaded');
setTimeout(check_ga,500);
}
}
check_ga();
演示: http://jsbin.com/rijiyojume/edit?html,console
或者如果您可以在 Google Analytics跟踪代码之后运行脚本
ga(function(tracker) {
console.log(tracker.get('clientId'));
});
演示: http://jsbin.com/wiqategifo/1/edit?html,console
参考: #ready-callback
答案 1 :(得分:25)
我太低了,无法回应安妮的回答,但有语法错误。分析名称首先是下划线,而setTimeout()语法是向后(并且不完整)。它应该是这样的:
function checkIfAnalyticsLoaded() {
if (window._gat && window._gat._getTracker) {
// Do tracking with new-style analytics
} else if (window.urchinTracker) {
// Do tracking with old-style analytics
} else {
// Probably want to cap the total number of times you call this.
setTimeout(checkIfAnalyticsLoaded, 500);
}
}
答案 2 :(得分:16)
function checkIfAnalyticsLoaded() {
if (window._gaq && window._gaq._getTracker) {
// Do tracking with new-style analytics
} else if (window.urchinTracker) {
// Do tracking with old-style analytics
} else {
// Retry. Probably want to cap the total number of times you call this.
setTimeout(checkIfAnalyticsLoaded, 500);
}
}
答案 3 :(得分:9)
我是这样做的:
var ga = window[window['GoogleAnalyticsObject'] || 'ga'];
if (typeof ga == 'function') {
// call ga object here
ga('send', 'event', 'Social Share Button', 'click', 'facebook');
}
答案 4 :(得分:4)
let checkIfAnalyticsLoaded = () => {
return new Promise((resolve, reject) => {
let timeStart = Date.now();
const TIMEOUT = 3000;
let _isLoaded = function() {
if (Date.now() - timeStart > TIMEOUT) {
reject('Timeout. Google analytics not injected!');
return;
}
if (window.ga && ga.create) {
resolve(ga);
return;
} else {
setTimeout(_isLoaded, 500);
}
};
_isLoaded();
});
}
checkIfAnalyticsLoaded()
.then((result => {
console.log('LOADED', result);
}))
.catch(console.error);
答案 5 :(得分:1)
上述方法都不适合我。也许是因为我通过GTM加载GA,不确定。但是这个简单的方法对我来说在控制台上起作用了:
ga.loaded
如果您尝试在脚本中进行检查,则可能需要等待一段时间,因为在doc准备就绪后加载了GA:
var t = setTimeout(function(){
console.log(ga.loaded);
}, 999);
答案 6 :(得分:1)
调整后的版本,不仅可以等待Google Analytics(分析)完成加载,而且还可以生成clientId(如果需要的话,就像我一样)。还增加了重试次数上限(20)。
var retryCounter = 0;
function checkIfAnalyticsLoaded() {
if ((typeof ga === 'function' && ga.loaded) || retryCounter++ > 20) {
// ga() puts your method in the Command Queue,
// which is applied after GA is done with initialization
ga(yourFunctionHere());
} else {
// Retry.
setTimeout(checkIfAnalyticsLoaded, 500);
}
}
// Auto load
(function () {
checkIfAnalyticsLoaded();
})();
答案 7 :(得分:0)
我正在使用它,但我构建了一个帮助函数,它允许我传入一个函数和参数,并在加载Google Analytics时调用它们。它每半秒检查一次,如果没有加载Google Analytics,则会在一分钟后停止检查。我认为这可能对其他人有所帮助。
用法:
function add(a,b){alert(a + ' + ' + b + ' = ' + (a+b));}
_mygaq(add,1,2);
代码:
function _mygaq(fn) {
this._count = this._count || 0;
this._running = this._running || false;
this._q = this._q || [];
if(arguments.length>0){
this._q.push({"f":fn,"p":Array.prototype.slice.call(arguments,1)});
} else {
this._count++;
}
if ((window._gat && window._gat._getTracker) || window.urchinTracker) {
this._count = 0;
this._running = false;
while (this._q.length > 0){
var _innr = this._q[0];
this._q = this._q.slice(1);
_innr.f.apply(_innr.f, _innr.p);
}
} else {
if( (arguments.length==0) || (!this._running && arguments.length>0)){
if(this._count < 120) setTimeout('_mygaq()', 500);
this._running = true;
}
}
}
答案 8 :(得分:0)
如果有人愿意尝试,我会有一个不同的解决方案。这假定您的Google Analytics对象为“ga”。更改您的超时和最大尝试以适合您的应用程序。
<script type="text/javascript">
var counter = 1;
function checkIfAnalyticsLoaded() {
if (window.ga) {
//LOADED!
} else {
counter = counter + 1;
if (counter < 6){
setTimeout('checkIfAnalyticsLoaded()', 200);
} else {
//LOADED!
}
}
}
window.onload = checkIfAnalyticsLoaded();
</script>
答案 9 :(得分:0)
我发现最优雅的解决方案是这样的:
const isAnalyticsLoaded = Promise.race([
new Promise(resolve => setTimeout(() => resolve(), 10000)),
new Promise(resolve => {
const isLoaded = () => window.ga && window.ga.loaded
? resolve()
: setTimeout(isLoaded, 200)
isLoaded()
})
])
第一个承诺仅用于超时,以防 ga 从未加载。如果您需要,您当然可以用 reject
代替 resolve
。
答案 10 :(得分:-1)
你也可以查看new Asynchronous Tracking然后你不需要检查你可以做什么,它会在加载后立即发送数据......