2011-07-25 28 views
6

私はサイトの多くの機能にrequire.js()を使用していますが、これまでのところうまく機能しているようです。私はGoogleアナリティクスのコードを含めるときに問題に遭遇しました。このコードはutm.gifの追加を拒否しているようだが、Googleにビーコンを送信していない。私はそれがスコープのものかどうか疑問に思っています。Require.jsでGoogle Analyticsを使用した場合の問題

define(function() { 
    var Analytics = {}; 
    Analytics.Apply = function() { 
    var _gaq = _gaq || []; 
    _gaq.push(['_setAccount', 'UA-XXXXX-X']); 
    _gaq.push(['_trackPageview']); 

    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); 
} 
return Analytics; 
}); 

ga.debugはエラーをスローせず、utm.gifは表示されません。 require.jsの外側にコードを移動すると(require.jsを使用しているモジュール式のjavascriptを意味するので、ページにインラインで追加するだけです)、utm.gifがページに正常に追加され、ga.debugがビーコンを送ります。

私は成功し、それを使用しているように見えるこのサイトを見つけましたが、私はそのサイトが異なるやっているかわからないんだけど:他にhttp://paceyourself.net/2011/05/14/managing-client-side-javascript-with-requirejs/

誰もがrequire.jsとGAを組み合わせた問題に遭遇?

+0

をだから、スコープの問題であるように見えるん。コードを使用しているとき: – boolean

+0

(Bah、私は本当に新しい行を入力してshift +入力してください、別の方法ではない...そしてコメントボックスはすべての改行を食べました) そうですスコープの問題コードを使用する場合: \tが必要([ "jqueryの"]、関数($){ \t VAR fooが( 'バー')を必要とする=; })。 \tコンソール。log(foo); 'foo'にアクセスできません。私は、javascriptのところまでは、fooはrequireのスコープ内にしか存在しないので、これが理にかなっていると思います。私はga.jsが生成されたときに_gaqを探していると思うが、これは必要なので見つからない。 ご意見はありますか? – boolean

+0

まあ、私は読めることは不可能だと確信しています。 – boolean

答えて

5

この問題については、requirejs group threadを参照してください。 Googleアナリティクス、私はRequireJSで使用コードスニペットの最新版について

3

される - ここに私達は行く

<script> 
    window.GoogleAnalyticsObject = 'ga'; 
    window.ga = { q: [['create', 'UA-40327700-1', 'jspm.io'], ['send', 'pageview']], l: Date.now() }; 
    require(['http://www.google-analytics.com/analytics.js']); 
</script> 
0

define([ 'http://www.google-analytics.com/ga.js' ], function (ga) { 
    ga = { q: [['create', 'UA-18710277-1', 'jspm.io'], ['send', 'pageview']], l: Date.now() }; 
}); 

私は現在に、帽子の先端を使用していますモジュールのこと@user2305274

9

その他の回答は私には役に立たなかったが、Google Analytics documentationを読んだ後は、うまくいくものを見つけ出すことができた。 requirejsは、関数が実行時間によって、analytics.jsの読み込みが完了していることが保証されているため、この作品

define(['ga'], function() { 
    window.ga('create', 'UA-XXXXXX-1'); 
    window.ga('send', 'pageview'); 
}); 

:独自のファイルanalytics.jsであなたの主なapp.js

requirejs.config({ 
    paths: { 
     ga: '//www.google-analytics.com/analytics' 
    } 
}); 

requirejs(['analytics'], function() { 
    ... 
}); 

。これは、window.ga関数がコマンドを受け入れる準備ができていることを意味します。

+0

「window.ga」だけでなく「ga」である理由を教えてください。 –

+0

私たちがグローバルを使用していることを明示的にするだけです。 Googleの解析コードはAMDモジュールとして登録されていないため、別の方法で参照する必要はありません。 RequireJSシムを使用することは可能かもしれませんが、私が試したかどうか覚えていません。 – murrayju

0

新しいanalytics.jsを使用している場合、他の解決策が私のために機能しませんでした。 requirejsはスクリプトのロードがいつ終了したかを判断できなかったため、依存関係としてURLを直接入力することはできませんでした。 requirejsのための非同期プラグインは私のために働くようには思われませんでした(私はGoogleマップAPIのために使用していますが)。

次のようなアプローチは、私の仕事:

define(function (require) { 

    var module; 

    // Setup temporary Google Analytics objects. 
    window.GoogleAnalyticsObject = "ga"; 
    window.ga = function() { (window.ga.q = window.ga.q || []).push(arguments); }; 
    window.ga.l = 1 * new Date(); 

    // Immediately add a pageview event to the queue. 
    window.ga("create", "{{TrackingID}}", "{{Domain}}"); 
    window.ga("send", "pageview"); 

    // Create a function that wraps `window.ga`. 
    // This allows dependant modules to use `window.ga` without knowingly 
    // programming against a global object. 
    module = function() { window.ga.apply(this, arguments); }; 

    // Asynchronously load Google Analytics, letting it take over our `window.ga` 
    // object after it loads. This allows us to add events to `window.ga` even 
    // before the library has fully loaded. 
    require(["http://www.google-analytics.com/analytics.js"]); 

    return module; 

}); 
関連する問題