2012-05-01 31 views
31

El siguiente mensaje aparece al visualizar una página de sitio en el registro de depuración de Chrome.Uncaught ReferenceError: _gaq no está definido (Google Analytics)

Uncaught ReferenceError: _gaq is not defined

La página en sí se supone que el seguimiento de un objeto utilizando el controlador de eventos onload y disparar un _trackEvent de Google Analytics.

Mi mejor conjetura es que tal vez el archivo ga.js no se carga en el tiempo y por lo tanto la onload_trackEvent encadenan no es capturado. el fragmento asincrónico se está utilizando antes del cierre </body> y el objeto se coloca en el medio <body>.

(algunos otros puestos se han referido a la posición jQuery también, pero, esto podría ser una pista falsa)

cualquier ayuda muy apreciada.

Respuesta

14

En cuanto a la posición del fragmento asincrónico, el GA help page dice -

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

Mi primer pensamiento fue que JS debe ser cargado en la parte inferior de la página para mejorar la velocidad de la página. Sin embargo, el fragmento de seguimiento asíncrono GA debe cargarse en el encabezado, ya que no cargará el ga.js inmediatamente, y no bloqueará la ejecución de la página. (Esto lo hace agregando dinámicamente la etiqueta del script al DOM, que pone al final de la cola.)

Si, por alguna razón, no se puede mover el fragmento asíncrono a la cabeza, puede definir _gaq a sí mismo, como esto:

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

Esto fue exactamente mi problema. Moví el código de seguimiento al pie de página y no me di cuenta de que estaba cargado usando asincrónico incluso ... ¡Gracias por la sugerencia! –

9

Tenía el mismo problema. Debe definir la matriz _gaq. Sólo tiene que añadir esto después de la secuencia de comandos de Google Analytics en la cabecera:

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

De https://developers.google.com/analytics/devguides/collection/gajs/ este código reemplaza el existente "fragmento tradicional" con la "última versión, asíncrono, se debe retirar el fragmento de seguimiento existente en primer lugar."

<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> 

Para ver sus eventos vienen en (a saber si esto está funcionando) buscar "Eventos" en la opción de menú "en tiempo real" en el lado izquierdo de la página "Información".

+0

esta es una respuesta mucho mejor y contiene una solución encapsulada; siempre estoy agradecido cuando el contexto no se deja a la imaginación. – Krafty

0

Cambiar el código de seguimiento a:

<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

No veo muy bien cómo funcionará esto. ¿No '_gaq' siempre se establecerá en la variable' gaq' que acaba de iniciar en la primera línea? – Shelton

+0

Esto garantiza un comienzo limpio para una nueva GA.Si desea utilizar otro _gaq existente, puede hacerlo. var _gaq = _gag lo referenciará (si el existente es una matriz, todo estará bien. Si no es una matriz, se obtendrá un error). en el código anterior, _gaq aunque se hace referencia a gaq (nueva variable) será una matriz. compruébalo. –

+0

Como sabes que 'gaq' está' indefinido', tus primeras dos líneas se pueden combinar en '_gaq = []'. Si está tratando de obtener una matriz existente o configurar una nueva matriz, entonces usaría el tradicional '_gaq = _gaq || [] '. Si '_gaq' ya existe, simplemente lo mató. La línea dos es efectivamente '_gaq = undefined || nueva matriz', en cuyo caso, siempre se establecerá para que sea igual a una matriz. – Shelton

3

Usted puede usar la última versión de analytics.js en lugar de 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.

He aquí un ejemplo:

ga('send', { 
    hitType: 'event', 
    eventCategory: 'Video', 
    eventAction: 'play', 
    eventLabel: 'cats.mp4' 
}); 
Cuestiones relacionadas