web-dev-qa-db-ja.com

javascript-Google Analyticsがまだロードされているかどうかを検出しますか?

ここでは、Googleアナリティクスのカスタム変数に情報を保存するプロジェクトに取り組んでいます。私が作成しているスクリプトは、GAがまだ読み込まれているかどうかを検出する必要があります。その前に、データをプッシュできます。このプロジェクトは、GAを使用するあらゆる種類のサイトで機能するように設計されています。問題GAがロードを終了したかどうか、および使用可能かどうかを確実に検出しています。

ここにいくつかの変動:

  1. GAを読み込む方法は複数あります。 Urchin日からの古いスクリプトから最新の非同期スクリプトまで。これらの一部はインライン、一部は非同期です。また、一部のサイトは、私の仕事のように、GAをロードするカスタムメソッドを実行します。 YUI getScriptを使用してロードします。

  2. 変数-変数名。一部のスクリプトでは、GA=に割り当てられた変数名はpageTrackerです。他のスクリプトでは、その_gaq。さらに、サイトがGAの実装に使用できる無限のカスタム変数名があります。

では、ページでGoogleアナリティクスが使用されているかどうか、およびページが読み込まれているかどうかを確認するための信頼できる方法を誰かが考えているのでしょうか。

24
Geuis
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);
  }
}
15
Annie

これは、above/beforeGoogle 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/rijiyoj​​ume/edit?html,console


または、スクリプトを実行できる場合Google Analyticsトラッキングコード

ga(function(tracker) {
  console.log(tracker.get('clientId'));
});

デモ:http://jsbin.com/wiqategifo/1/edit?html,console

参照:#ready-callback

33
l2aelba

私は低すぎるので、機能するが構文エラーがあるアニーの答えに応答できません。アナリティクス名は最初にアンダースコアがあり、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);
  }
}
24
soutarm

ここに私がそれをした方法があります:

var ga = window[window['GoogleAnalyticsObject'] || 'ga'];
if (typeof ga == 'function') {
  // call ga object here
  ga('send', 'event', 'Social Share Button', 'click', 'facebook');
}
9
Vadim Eremeev

上記の方法はどれも私にはうまくいきませんでした。たぶん、私はGA GTMを介してロードしているので、確かではありません。しかし、この簡単な方法は、コンソールから機能しました:

ga.loaded

スクリプト内から確認しようとしている場合は、GAがドキュメントの準備の後に読み込まれるので、少し待つ必要があるかもしれません:

var t = setTimeout(function(){
        console.log(ga.loaded);
}, 999);
4
AyexeM

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);
4
oboshto

Google Analyticsの読み込みが完了するだけでなく、alsが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();
})();
1
DdW

私はこれを使用していますが、関数と引数を渡すことができるヘルパー関数を作成し、Googleアナリティクスが読み込まれると呼び出されます。 0.5秒ごとにチェックし、Googleアナリティクスが読み込まれていない場合は1分後にチェックを停止します。これは他の人に役立つかもしれないと思いました。

使用法:

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;
    }
  }
}
0
John Lindsey