4

要約:

コンテンツスクリプトの使い方を誤解しました。そして、それはこの問題につながります。これがGoogleの公式ドキュメントからの引用です:

実行環境

コンテンツスクリプトは、孤立した世界と呼ばれる特別な環境で実行されます。挿入されたページのDOMにはアクセスできますが、ページによって作成されたJavaScript変数や関数にはアクセスできません。各コンテンツスクリプトは、実行中のページで他のJavaScriptが実行されていないように見えます。同じことが逆にも当てはまります。ページで実行されているJavaScriptは、コンテンツスクリプトで定義された関数を呼び出したり、変数にアクセスしたりすることはできません。

詳細: GoogleAnalyticsによるコンテンツスクリプトの追跡

-

Chrome拡張機能にトラッキングコードを追加しています。しかし、テストすると、_gaq.pushは番号3を返します。テストしたところ、拡張子で_gaq.pushを呼び出すと、番号が増え続けることがわかりました。しかし、コンソールで呼び出すと、すべて問題ありません(すべて同じコード)。

このエラーをより深く追跡するにはどうすればよいでしょうか。

すべての回答をありがとうございました!

アップデート:

_gaqの戻り値をトレースすると、それはまだ配列です。つまり、ga.jsがロードされていないということですよね?

しかし、ga.jsが私のスクリプトにロードされていないようです。コンソールに手動で_gaqと入力しない限り、それはオブジェクトです。これは非常に奇妙です。

DOMを確認したところ、タグがすでに追加されていることがわかりました。

ネットワークパネルを確認したところ、ga.jsがキューにまったくロードされていないことがわかりました。しかし、なぜコンソールを使用して_gaqオブジェクトにアクセスできるのでしょうか。

UPDATE2:

console.logを使用して「window._gaq」の値を追跡しましたが、console.log(window._gaq)の戻り値は、コンソールに「window._gaq」と直接入力する場合とは異なります。それは完全に2つの異なるオブジェクトです。setInterval関数を使用して結果をログに記録すると、期待されるオブジェクトではなく、配列が返され続けます。

4

1 に答える 1

7

スクリプトを実行する_gaqと、通常の配列が突き出ます。また、JavaScriptの他の配列と同様に、push1つ以上の要素を配列に挿入し、配列の最終的な長さを返すメソッドがあります。

例えば:

var _gaq = [];
> undefined
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
> 1
_gaq.push(['_setDomainName', 'mysite.com']);
> 2
_gaq.push(['_trackPageview'], 
          ['_trackEvent', 'cat', 'act']);
> 4

ga.jsファイルがロードされた後、_gaq配列が読み取られ、そこにプッシュされた命令を処理できるようになり、_gaq配列がオブジェクトに置き換えられます。オブジェクトはpush関数も実装します。ただし、この場合、push関数はga.jsライブラリへの命令を実行してから、0を返すことに注意してください。

例えば:

var _gaq = {
  push: function(){
    // Do something here
    return 0;
  }
};
> undefined
_gaq.push(['_trackPageview'])
> 0

これは、ライブラリ(ga.js)が読み込まれる前でも使用できるAPIを作成するための非常にスマートなGoogleの設計です。

そのため、スクリプト中_gaq.pushはArrayクラスのメソッドであり、増加する数値を返し、コンソールでは常に0を返します。

これはまったく問題ではありません。意図したとおりに動作しているようです。

アップデート

ga.jsはすでに読み込まれているようです。キャッシュされていて、ネットワークパネルに表示されていない可能性があります。

ga.jsは、追跡スクリプトのこの部分によってロードされます。

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

非同期で読み込まれます。したがって、このスニペットが実行された後、ロードされますが、ロードされる正確なポイントは不明です。

ga.jsファイルがいつロードされるかを知る必要がある場合は、コールバックを_gaqにプッシュすると、ga.jsファイルがロードされるときにコールバックが実行されます。

例えば:

_gaq.push(function(){
  console.log('ga.js loaded!');
  debugger;
});
于 2012-10-20T02:23:15.757 に答える