27

Estoy intentando agregar la versión asíncrona del código de seguimiento de Google Analytics a un sitio web.Uso del código asincrónico de Google Analytics desde el archivo JS externo

Me gustaría mantener el JavaScript en un archivo separado, y llamar desde allí.

Esto es lo que tengo actualmente en mi archivo .js:

function addLoadEvent(func) { 
    var oldonload = window.onload; 
    if (typeof window.onload != 'function') { 
     window.onload = func; 
    } else { 
     window.onload = function() { 
      oldonload(); 
      func(); 
     } 
    } 
} 

function loadtracking() { 
    var _gaq = _gaq || []; 
     _gaq.push(['_setAccount', 'UA-XXXXXXX-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); 
     })(); 
} 

addLoadEvent(loadtracking); 

Y aquí es lo que tengo en la etiqueta <head> de mi página principal:

<script type="text/javascript" src="js/google-analytics.js" ></script> 

Sin embargo, hay obviamente un problema, ya que después de unos días, ¡no estoy obteniendo estadísticas!

¿Alguna idea de lo que necesito cambiar?

Gracias, Neil


EDIT: Ok ... Después de algunos comentarios a continuación, voy a añadir las nuevas contenido actual de mi archivo .js. Lo mantendré actualizado para que, cuando esto se resuelva, esperemos que ayude a otras personas que intentan hacer cosas similares.

var _gaq = _gaq || []; 

function loadtracking() { 
     window._gaq.push(['_setAccount', 'UA-XXXXXXX-X']); 
     window._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); 
     })(); 
} 

loadtracking(); 
+0

¿Resultó que esto solucionó su problema? Me encuentro con el mismo problema, aunque tenía mi var _gaq definido globalmente en el archivo .js. Gracias. –

+0

Por lo que recuerdo, sí lo hizo. Para ser honesto, para la mayoría de las aplicaciones, sugiero seguir los consejos a continuación y poner el código directamente en el documento ... Era un requisito para este proyecto específico que estuviera en un archivo separado, que puede o no ser el caso contigo. – NeilD

+0

He estado leyendo muchos temas similares en SO y he visto a personas decir que no hay problema con eso, aparte de una posible ligera demora en cargar el guión, mientras que otros han dicho que arruinará mi vida y me condenará al infierno. Necesito que pase valores dif según la página que se está viendo, y quiero mantener los cambios de código en un único archivo en lugar de en cada página del sitio web.Parece que funciona bien, pero si puede recordar cualquier problema que haya tenido, hágamelo saber. Lo aprecio. –

Respuesta

22

Su "var _gaq" está dentro de una función. Eso significa que tiene un alcance local dentro de esa función y no existirá globalmente. GA depende de la variable global _gaq. Si desea mantenerlo dentro de una función como esa, hágalo como window._gaq.

+2

** GRACIAS ** Moví var _gaq fuera de mi función ¡funcionó al instante! – Airn5475

+0

Gracias! Esto solucionó nuestro problema también :) –

14

Olvida por completo el punto del código de seguimiento asíncrono. No lo coloque en un archivo externo porque eso es exactamente como incluir el antiguo GA sincrónico.

Y lo más importante, no posponga el código de seguimiento a window.onload ya que podría dispararse demasiado tarde.

Si utiliza el asíncrona GA sólo hay que poner en la parte superior de documentar en una etiqueta de secuencia de comandos en línea. Esta es la recomendación en Google Analytics website también.

insertar el fragmento asíncrono en el inferior de la sección <head> de sus páginas, después de cualquier otros scripts tu página o plantilla podría utilizar.

+0

Considero tu punto en el código AddLoadEvent(), y he eliminado todas las partes de windows.onload ... :) ¿Te importa si te pido que profundices en cómo el archivo externo lo hará? "exactamente como incluir el antiguo GA síncrono". ¿Por qué dividirlo en un archivo separado hace que se ejecute de manera diferente? He leído la recomendación, pero tengo una necesidad en este proyecto para que el código GA esté separado de la página maestra. – NeilD

+3

El gran beneficio de tener el seguimiento asíncrono es que puede comenzar a enviar eventos a GA antes de que se cargue el código. Tan pronto como su página pueda comenzar a insertar elementos en la matriz _gaq, puede comenzar a almacenar eventos. Por el contrario, cuando fuerza la variable fuera de su secuencia de comandos principal, está forzando a que el seguimiento espere hasta que se haya descargado la secuencia de comandos externa. Así es como es exactamente el viejo guión. –

+0

del mismo modo, obligando a tus eventos a esperar hasta que se active la función de carga a través de window.onload <--- te obligará a esperar aún más ... hasta que cada imagen se termine de descargar; ¿Qué pasa si algún archivo retrasado se cuelga? –

Cuestiones relacionadas