7

GoogleAnalyticsは最初にを使用し_gaq [object Array]ます。関数に配列を渡すことは、JavaScriptでオブジェクトを渡すことであり、したがって参照によるものです。

編集:回答で指摘されているように、参照は値によって渡されます。JavaScriptでの参照/値の受け渡しの詳細については、https://stackoverflow.com/a/5314911/120521を参照してください。)

以下のコードは、jQueryを使用してDOMが読み込まれるのを待ちchange、ユーザーがフィールドを変更すると仮想ページビューをGoogleAnalyticsに送信するイベントをアタッチし<input/>ます。

var _gaq = _gaq || [];
_gaq.push(['_setAccount', _gAAccount]);
_gaq.push(['_trackPageview']);

(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);
})();

var Tracking = {
  trackInputs: function ($, gaObject) {
    var inputs = $('#signUp').find('input');
    inputs.bind('change', function () {
      gaObject.push(['_trackPageview', '/virtual/input']);
      console.log(gaObject); // Outputs:
                         // [Array[2], Array[1], Array[2]]
                         // i.e. _setAccount, _trackPageview,
                         // and _trackPageview calls.
    });
  }
};

jQuery(document).ready(function($) {
  Tracking.trackInputs($, _gaq);
});

// ... DOM begins below

ただし、上記のコメントからわかるように、このtrackInputs()メソッドは「元の」配列を出力します。通常、Google Analyticsスクリプトは、_gaq配列を_gaqオブジェクトに変更し、オブジェクトのプッシュプロトタイプを変更して、新しい呼び出しがオブジェクトにプッシュされたときにGoogleAnalyticsサーバーにリクエストを送信するようにします。

この変更も参照によってに渡されないのはなぜtrackInputs()ですか?

ロードされたGoogleAnalyticsスクリプトはTracking.trackInputs()定義の後に発生する(または発生するのでしょうか?)ので、ブラウザはそれが現在ではあることを理解できない可能性があります[object object]が、元のスクリプトであると考え続け[object Array]ます。しかし、それはもはや参照ではありませんね?

_gaqオブジェクトをグローバルに使用する(メソッドにまったく渡さない)と問題は解決しますが、なぜこれが機能しないのかを理解したいと思います。)

4

4 に答える 4

5
jQuery(document).ready(function($) {
  Tracking.trackInputs($, _gaq);
});

GA がロードされる前にDOM の準備が整っているため、参照は_gaq引き続き通常の配列を指し、関数gaObject内のローカル シンボルによって永続化されtrackInputs()ます。

trackInputs: function ($, gaObject) {

GA がロードされた後、グローバル シンボル_gaqはトラッカーによって置き換えられますが、gaObject依然として古いシンボルを指しています。

trackInputs()を使用する代わりに、GA の「準備完了」機能を使用して関数を呼び出すことができます$(document).ready(...)

_gaq.push(function() {
    // when this runs, the tracker would have initialized;
    Tracking.trackInputs($, _gaq);
});
于 2013-03-11T12:44:44.893 に答える
3

Google Analyticsは、最初は_gaq[オブジェクト配列]を使用します。関数に配列を渡すことは、JavaScriptでオブジェクトを渡すことであり、したがって参照によるものです。

あなたの最初の推定は正しくありません。Javascriptは常に値渡しを使用します。値渡し。PASSBYVALUE。

でオブジェクトへの参照を渡します。参照はBYVALUEで渡されます。結局のところ、同じ基になる配列への多くの参照があります。これは、参照が値によって渡されるたびに、参照 の新しいコピーがありますが、オブジェクトが変更されることはないためです。

通常、Google Analyticsスクリプトは、_gaq配列を_gaqオブジェクトに変更し、オブジェクトのプッシュプロトタイプを変更して、新しい呼び出しがオブジェクトにプッシュされたときにGoogleAnalyticsサーバーにリクエストを送信するようにします。

それはどこでそれをしますか?

ただし、上記のコメントからわかるように、trackInputs()メソッドは「元の」配列を出力します。

もちろんそうです。

var _gaq = _gaq || [];
_gaq.push(['_setAccount', _gAAccount]);
_gaq.push(['_trackPageview']);

定義して配列し、そこに物を入れます。

jQuery(document).ready(function($) {
  Tracking.trackInputs($, _gaq);
});

その配列を値でメソッドに渡します

var Tracking = {
  trackInputs: function ($, gaObject) {
    ...
    inputs.bind('change', function () {
      gaObject.push(['_trackPageview', '/virtual/input']);
      ...
    });
  }
};

元の配列への参照であるgaObjectの周囲にクロージャを作成し、それを変更ハンドラーで使用します。これは、と同じ参照ではなく_gaq、その参照のコピーですが、同じ配列を指しています。

于 2013-03-11T12:30:14.900 に答える
0

私はあなたのスクリプトを約20分間じっと見つめていたので、愚かなことを言うリスクがありますが、明らかなことは何もありません...意図したとおりに機能している可能性はありますが、テストケースは割引されています自分の IP アドレスとしての分析は、プロファイル フィルターの下に表示されますか?

于 2013-03-11T12:25:03.697 に答える
0
jQuery(document).ready(function() {
  _gaq.push(function() {
    Tracking.trackInputs($, _gaq);
  });
});
于 2013-03-11T12:54:05.230 に答える