2011-07-25 48 views
6

我使用require.js(http://requirejs.org/)爲我的網站上的一些功能,到目前爲止,它似乎運作良好。儘管試圖包含Google Analytics代碼,但我遇到了一個問題。該代碼似乎拒絕添加utm.gif,並且沒有向Google發送燈塔。我想知道這是否是一個範圍的事情。使用谷歌分析與Require.js的問題

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,我真的希望進入一個新的行,並轉移+輸入張貼,而不是其他方式...和評論框吃了我所有的換行符!) 所以它似乎是範圍問題。當使用的代碼: \t 要求([ 「的jquery」],函數($){ \t變種富=要求( '巴'); }); \t控制檯。日誌(FOO); 我無法訪問'foo'。我猜只要javascript變得有意義,因爲foo只存在於require的範圍內。我懷疑,當生成ga.js時,它正在尋找_gaq,由於它在require中,因此無法找到它。 有什麼想法? – boolean

+0

嗯,我很確定這是不可能讀取。 – boolean

回答

3

對於谷歌Analytics(分析)的最新版本,我RequireJS使用的代碼片斷 -

<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後,我找到了一些可行的方法。

在主app.js

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

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

在它自己的文件analytics.js

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

這工作,因爲requirejs保證本函數執行的時候,analytics.js將已完成加載。這意味着window.ga函數已準備好接受命令。

+0

你能告訴我爲什麼它是'window.ga'而不僅僅是'ga'嗎? –

+0

真的只是爲了明確表明我們正在使用全球。 Google的分析代碼不會註冊爲AMD模塊,因此我們沒有其他方法可以參考。有可能使用RequireJS墊片,我不記得我是否嘗試過。 – murrayju

0

當使用更新的analytics.js時,其他解決方案對我無效。直接將URL作爲依賴項不起作用,因爲requirejs無法確定腳本何時完成加載。 requirejs的異步插件似乎也不適用於我(雖然我用它爲google maps 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; 

});