javascript - 检测Google Analytics是否已加载?

时间:2009-12-23 19:43:52

标签: javascript google-analytics

我正在开发一个项目,该项目会在Google Analytics自定义变量中存储一些信息。我正在构建的脚本需要检测GA是否已经加载,然后才能将数据推送到它。该项目旨在适用于使用GA的任何类型的网站。问题是可靠地检测GA是否已完成加载并且可用。

这里有几个变化:

  1. 有多种加载GA的方法。从Urchin开始的旧脚本到最新的异步脚本。其中一些是内联的,一些是异步的。此外,有些网站会像我工作那样自定义加载GA的方法。我们使用YUI getScript加载它。

  2. 变量名称。在某些脚本中,分配给GA的变量名称为pageTracker。在其他人中,_gaq。然后是网站可用于实现GA的自定义变量名称的无限。

  3. 那么,是否有人对可能检查Google Analytics是否在页面上使用以及是否已加载的可靠方法有任何疑问?

11 个答案:

答案 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)

ECMA2015风格

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然后你不需要检查你可以做什么,它会在加载后立即发送数据......