2012-05-01 22 views
31

Następujący komunikat pojawia się podczas przeglądania strony witryny w dzienniku diagnostyki Chrome.Niepowodzenie ReferenceError: _gaq nie jest zdefiniowany (Google Analytics)

Uncaught ReferenceError: _gaq is not defined

Sama strona ma na celu śledzenie obiektu za pomocą obsługi zdarzeń onload i wystrzelić _trackEvent Google Analytics.

Zgaduję, że prawdopodobnie plik ga.js nie wczytuje się w czasie, dlatego wyzwolony _trackEvent nie zostanie przechwycony. urywek async jest używany przed zamknięciem </body>, a obiekt jest umieszczony w środku <body>.

(niektóre inne stanowiska nie odwołuje pozycję jQuery też, ale może to być czerwony śledź)

wszelka pomoc mile widziana.

Odpowiedz

14

dotyczącej położenia fragmentu asynchronicznego The GA help page mówi -

Paste this snippet into your website template page so that it appears before the closing </head> tag.

Moją pierwszą myślą było to, że JS powinny być ładowane na dole strony, aby poprawić szybkość strony. Jednak fragment kodu śledzenia asynchronizacji GA powinien zostać załadowany do nagłówka, ponieważ nie będzie on natychmiast ładował pliku ga.js i nie będzie blokował wykonywania strony. (Robi to poprzez dynamiczne dodawanie tagu skryptu do DOM, który umieszcza to z tyłu kolejki.)

Jeśli z jakiegoś powodu nie można przenieść fragment asynchronicznego do głowy, można zdefiniować _gaq siebie, jak to-

<button onclick="var _gaq = _gaq || []; _gaq.push(['_trackEvent', 'button3', 'clicked'])"/><button> 
+0

To był dokładnie mój problem. Przenieśliłem kod śledzenia do stopki i nie zdawałem sobie sprawy, że został załadowany za pomocą async nawet .. Dzięki za napiwek! –

9

miał ten sam problem. Musisz zdefiniować tablicę _gaq. Wystarczy dodać to po skryptu Google Analytics w nagłówku:

var _gaq = _gaq || []; 
_gaq.push(['_setAccount', 'UA-XXXXXX-X']); 
_gaq.push(['_trackPageview']); 
29

Od https://developers.google.com/analytics/devguides/collection/gajs/ ten kod zastępuje istniejący fragment „tradycyjnych” z „najnowszej wersji, asynchroniczny, należy usunąć istniejący fragment śledzenia w pierwszej kolejności.”

<script type="text/javascript"> 

    var _gaq = _gaq || []; 
    _gaq.push(['_setAccount', 'UA-XXXXX-X']); 
    _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); 
    })(); 

</script> 

aby zobaczyć swoje wydarzenia przyjść (aby wiedzieć, czy to działa) spojrzeć na „Wydarzenia” pod „Real-Time” opcji menu po lewej stronie strony „Monitorowanie”.

+0

to znacznie lepsza odpowiedź i zawiera enkapsulowane rozwiązanie - zawsze jestem wdzięczny, gdy kontekst nie jest pozostawiony wyobraźni. – Krafty

0

Zmiana kodu śledzenia do:

<script type="text/javascript"> 
     var gaq; 
     var _gaq = gaq || []; 
     _gaq.push(['_setAccount', 'UA-XXXXX-X']); 
     _gaq.push(['_setDomainName', 'yourdomain.com']); 
     _gaq.push(['_setAllowLinker', true]); 
     _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); 
     })(); 

</script> 
+0

Nie bardzo rozumiem, jak to zadziała. Czy '_gaq' nie będzie zawsze ustawione na zmienną' gaq', którą właśnie zainicjowałeś w pierwszym wierszu? – Shelton

+0

Zapewnia to czysty start nowego GA.Jeśli chcesz użyć innej istniejącej _gaq, możesz. var _gaq = _gag odwoła się do niego (jeśli istniejący jest tablicą, wszystko będzie ok. jeśli nie jest tablicą, otrzymasz błąd). w powyższym kodzie, _gaq choć odniesienie do gaq (nowa zmienna) będzie tablicą. sprawdź to. –

+0

Ponieważ wiesz, że 'gaq' jest' niezdefiniowanym', twoje pierwsze dwie linie mogą być połączone w '_gaq = []'. Jeśli próbujesz uzyskać istniejącą tablicę lub ustawić nową tablicę, użyjesz tradycyjnego '_gaq = _gaq || [] '. Jeśli '_gaq' już istnieje, po prostu go zabiłeś. Linia druga to faktycznie '_gaq = undefined || new Array', w którym to przypadku zawsze będzie ustawiona na równe tablicy. – Shelton

3

Można użyć ostatnią wersję analytics.js zamiast ga.js

ga.js is a legacy library. If you are starting a new implementation we recommend you use the latest version of this library, analytics.js. For exisiting implementations, learn how to migrate from ga.js to analytics.js.

Oto przykład:

ga('send', { 
    hitType: 'event', 
    eventCategory: 'Video', 
    eventAction: 'play', 
    eventLabel: 'cats.mp4' 
}); 
Powiązane problemy