2011-07-25 17 views
6

Używam require.js (http://requirejs.org/) do wielu funkcji w mojej witrynie i jak na razie wygląda to dobrze. Podczas próby dołączenia kodu Google Analytics wystąpił problem. Wydaje się, że kod odmawia dodania utm.gif i nie wysyła sygnału nawigacyjnego do Google. Zastanawiam się, czy to kwestia zakresu.Problem z korzystaniem z Google Analytics z 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 nie zgłasza błędów, a utm.gif nie pojawia się. Jeśli przeniesię kod poza require.js (przez co rozumiem modułowy javascript używający require.js, więc po prostu dodanie go do strony), utm.gif zostanie pomyślnie dodany do strony, a ga.debug odesłał jej sygnał nawigacyjny.

znalazłem tę stronę, która wydaje się być używając go z powodzeniem, ale nie jestem pewien, co robi, że strona jest inna: http://paceyourself.net/2011/05/14/managing-client-side-javascript-with-requirejs/

ktoś inny napotkasz problemów łączących require.js i GA?

+0

Więc to wydaje się być kwestia zakresu. Używając kodu: – boolean

+0

(Bah, naprawdę chciałbym wprowadzić nowy wiersz, a shift + wpisać wysłany, a nie na odwrót ... i pole komentarzy zjadło wszystkie moje przerwy w linii!) Wygląda na to, że problem zakresu. Przy użyciu kodu: \t wymagają ([ "jQuery"], funkcja ($) { \t var xxx = wymagają ('bar'); }); \t konsola.log (foo); Nie mogę uzyskać dostępu do "foo". Sądzę, że jeśli chodzi o javascript, ma to sens, ponieważ foo istnieje tylko w zakresie wymagań. Podejrzewam jednak, że gdy generowany jest ga.js, szuka on _gaq, którego nie można znaleźć, ponieważ jest potrzebny. Jakieś myśli? – boolean

+0

Cóż, jestem prawie pewien, że nie da się tego przeczytać. – boolean

Odpowiedz

3

Dla najnowszej wersji Google Analytics, urywek kodu używam z RequireJS jest -

<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

Zaczynamy:

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

To moduł Obecnie używam, kapelusz wskazówka do @ user2305274

9

Żadna z pozostałych odpowiedzi nie zadziałała, ale udało mi się wymyślić coś, co działa, po przeczytaniu Google Analytics documentation.

w głównym app.js

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

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

we własnym pliku analytics.js:

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

To działa, ponieważ requirejs gwarantuje, że w momencie jej wykonywania analytics.js będą zakończeniu ładowania. Oznacza to, że funkcja window.ga jest gotowa do przyjmowania poleceń.

+0

Czy możesz mi powiedzieć, dlaczego jest to 'window.ga', a nie tylko' ga'? –

+0

Naprawdę tylko po to, aby jasno powiedzieć, że używamy globalnego. Kod analityczny Google nie rejestruje się jako moduł AMD, więc nie mamy innego sposobu na odniesienie go. Może być możliwe użycie podkładki RequireJS, nie pamiętam, czy próbowałem tego, czy nie. – murrayju

0

Inne rozwiązania nie sprawdziły się podczas korzystania z nowszej wersji analytics.js. Wprowadzenie adresu URL bezpośrednio jako zależności nie działało, ponieważ requirejs nie był w stanie określić, kiedy skrypt zakończył ładowanie. Asynchroniczna wtyczka dla requirejs również nie działała dla mnie (chociaż używam jej dla api mapy Google).

następujące podejście pracował dla mnie:

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; 

}); 
Powiązane problemy