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

Geu*_*uis 26 javascript google-analytics

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

这里有几个变化:

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

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

那么,是否有人想知道什么是可靠的方法来检查页面上是否正在使用Google Analytics,以及它是否已加载?

l2a*_*lba 35

这一点,你可以把代码上方/前谷歌Analytics跟踪代码:

function check_ga() {
  if (typeof ga === 'function') {
    console.log('Loaded :'+ ga);
  } else {
    console.log('Not loaded');
    setTimeout(check_ga,500);
  }
}
check_ga();
Run Code Online (Sandbox Code Playgroud)

演示: http ://jsbin.com/rijiyoj​​ume/edit?html,console


或者,如果您可以在Google Analytics跟踪代码之后运行脚本:

ga(function(tracker) {
  console.log(tracker.get('clientId'));
});
Run Code Online (Sandbox Code Playgroud)

演示: http ://jsbin.com/wiqategifo/1/edit?html,console

参考: #ready-callback


sou*_*arm 24

我太低了,无法回应安妮的回答,但有语法错误.分析名称首先是下划线,而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);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好,但我必须这样做:setTimeOut(checkIfAnalyticsLoaded,500); (6认同)

Ann*_*nie 15

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 而不是检查`window.pageTracker`,最好只检查实际函数的存在:`if(_gat && _gat._getTracker){/*new style analytics*/} (2认同)

Vad*_*eev 9

我是这样做的:

var ga = window[window['GoogleAnalyticsObject'] || 'ga'];
if (typeof ga == 'function') {
  // call ga object here
  ga('send', 'event', 'Social Share Button', 'click', 'facebook');
}
Run Code Online (Sandbox Code Playgroud)


obo*_*hto 8

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);
Run Code Online (Sandbox Code Playgroud)


Aye*_*xeM 7

以上方法都不适合我。也许是因为我正在通过 GTM 加载 GA,不确定。但是这个简单的方法对我来说确实可以从控制台运行:

ga.loaded
Run Code Online (Sandbox Code Playgroud)

如果您尝试从脚本中进行检查,您可能需要稍等片刻,因为 GA 在 doc ready 后加载:

var t = setTimeout(function(){
        console.log(ga.loaded);
}, 999);
Run Code Online (Sandbox Code Playgroud)


小智 5

只需在窗口加载事件后检查该对象即可。

if(window.google_tag_manager){ /*It's loaded!*/ }
Run Code Online (Sandbox Code Playgroud)