2010-03-29 13 views
47

El código asíncrono de seguimiento de Google Analytics tiene el siguiente aspecto:¿Qué es "var _gaq = _gaq || [];" para?

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); 
})(); 

Sobre la primera línea:

var _gaq = _gaq || []; 

creo que asegura que si _gaq ya está definido debemos usarlo de otra manera debería una formación.

¿Alguien puede explicar para qué sirve?

Además, ¿importa si se renombra _gaq? En otras palabras, ¿Google Analytics se basa en un objeto global llamado _gaq?

+1

También vale la pena señalar que, a menos que use dos fragmentos en la misma página (y use código incorrecto), existen formas mucho mejores de implementar múltiples rastreadores que simplemente pegar el fragmento dos veces con diferentes ID de cuenta), puede reemplazar esta línea con 'var _gaq = []'. Algunas más posibles microoptimizaciones para el fragmento asíncrono de Google Analytics se pueden encontrar aquí: http://mathiasbynens.be/notes/async-analytics-snippet –

Respuesta

15

Sí, se asegura que _gaq se define, de manera que _gaq.push() nunca falla.

No me meteré con el nombre de las variables en el código de GA ... ¿tiene alguna razón para hacerlo? ¿Entra en conflicto con alguna de tus variables? (Luego me iba a cambiar la mía ...)

+4

aún fallaría si se declarase _gaq antes, pero no era una matriz sino una número o cadena :) – pawel

+0

No tengo el problema per se con '_gaq', pero no he encontrado en ninguna parte de la documentación de google analytics una advertencia acerca de tener una variable llamada _gaq. –

+0

Eso sería como una invitación abierta a los piratas informáticos, como el robots.txt. Podría interpretar "por favor no use xxx" ya que "nuestro código es vulnerable cuando usa xxx".:-) – Prutswonder

0

Esto significa que si _gaq ya está definido que el uso que de lo contrario se declara una matriz vacía. Con push puede anular la configuración. Si el objeto _gaq no estaba definido, las 2 "líneas" después de eso producirían un error.

Sí, el objeto _gaq es de esperar en el script que se incluye en el código allí (ga.js).

2

Sí, hace exactamente lo que usted cree :) Es una forma rápida para

if(!_gaq){ var _gaq = [] } 
+0

bien. lo suficientemente justo. Para qué sirve ? –

+0

¿Para qué sirve la variable _gaq, o la asignación de una matriz vacía a esta variable? Parece que el script de seguimiento usa la variable global _gaq para contener algunos datos antes de enviarlos al servidor. La fuente comprimida es un poco difícil de seguir, pero hay var ba = "_ gaq" en la primera línea, y var i = ventana [ba]; (que devuelve la variable global _gaq) en la última línea. Hacer _gaq una matriz si no está definida solo hace que sea posible usar el método .push() en ella. – pawel

13

usando || en la asignación es un truco común de programación que se aprovecha de la dirección evaluación del operador, lo que es de izquierda a derecha Eso significa que evalúa el lado izquierdo primero. Entonces, y solo si es falso (o un equivalente falso), evalúa el lado derecho.

También puede tomar ventaja de las || o && operadores en una sentencia if sencilla, de manera que

if (a > 5) { 
    do_a(); 
} 

if (!some_boolean) { 
    do_b(); 
} 

convierten

a > 5 && do_a(); 
some_boolean || do_b(); // Note that the negation operator `!` is gone! 

que son ambos manera más agradable a la vista.

La razón lenguajes permiten esto, es porque es una pérdida de tiempo a evaluar si el lado derecho al lado izquierdo hará que toda la línea de falla de todos modos. Por lo tanto, simplemente lo ignora a menos que sea necesario.

24

Esta línea está ahí para permitir múltiples fragmentos de GA en la misma página. Asegura que el segundo fragmento no sobrescribe un _gaq definido por el primero.

El seguimiento asincrónico de GA funciona definiendo primero _gaq como una matriz. Esta matriz actúa como una cola, que le permite presionar (adjuntar) la configuración y seguir "comandos" (como _trackPageview) al final de la cola. Sus comandos se almacenan en esta matriz hasta que ga.js se descargue completamente.

Cuando ga.js. está listo, ejecuta todos los comandos de la matriz _gaq y reemplaza _gaq con un objeto.Este objeto también tiene un método push, pero en lugar de ejecutar comandos en cola, los ejecuta de inmediato, porque ga.js está disponible para procesarlos.

Este mecanismo le permite realizar comandos de configuración y seguimiento sin saber si el navegador ha terminado de descargar ga.js. Esto es necesario porque el fragmento asincrónico descarga ga.js sin bloquear la ejecución de otro código en la página. Las cosas se pondrían feas si ese otro código (tus comandos de configuración) necesitara saber el estado de ga.js que se está descargando.

Todo esto absolutamente hace depende del uso del nombre _gaq. No debe intentar nombrarlo si desea que el seguimiento asíncrono funcione.

3

EDIT:

i va a añadir más detalle

_gaq es simplemente una matriz de JavaScript, como primera definido. agrega eventos, como callbacks de seguimiento de eventos

cuando se carga el script ga.js, sin embargo, google toma esta matriz y la convierte en un objeto que usa ga.

esta es la razón por la que empuja las funciones en la matriz _gaq, luego llama al script ga.js después de que haya terminado de construir la matriz.

gaq es google analytics queue. es una pila de métodos GA, como seguimiento de eventos, atribución de páginas, etc. Usas el método push() para poner cosas de GA allí. reduce la interferencia del evento, todos deberían hacer esto, o al menos aprender el concepto.

3

Lamento responder tardíamente, pero leo la respuesta aceptada y creo que se olvida lo más importante. Así que voy a tratar de explicar lo que he entendido:

En primer lugar, se ha explicado, pero la respuesta tiene que ser completa, de modo que explico también, comienzan con el código:

var _gaq = _gaq || []; 

Asegura que _gaq se define. Si no está definido, se inicializa en una matriz vacía.

Piense que como el equivalente:

var _gaq; 
/* ... */ 
if(!_gaq) 
    _gaq = []; 

El valor javascript undefined es "falsish"/"Falsy", es decir, se evalúa como falsa cuando se convierte a un valor booleano, por lo _gaq se inicializa con [] en este caso .

Lo importante tener en cuenta es que:

  • si _gaq contiene una matriz en esta etapa, _gaq es "trueish", por lo que se mantendrá su valor (y no ser vaciado)
  • si _gaq contiene otro tipo de objeto en esta etapa, _gaq también puede mantener su valor

Bueno, he explicado, lo mejor que puedo, algo que ya se ha explicado. La mayoría de las personas con experiencia en javascript ya lo habían entendido. Sin embargo, la parte interesante no es solo el comienzo.

_gaq.push(['command', 'argument']); // is very interesting too 

Si _gaq es una matriz, todos ustedes supongo que el tema ['command', 'argument'] se añade a la matriz. Google Analytics almacena esto en su cola para su posterior procesamiento. La matriz _gaq se usa como una cola.

Pero la parte realmente interesante es que _gaq.push(/*...*/) se puede hacer sin tener una matriz llamada _gaq. Es solo una llamada a un método, y las matrices que no son matrices también pueden tener un método "push".

"Abre nuevas posibilidades". Aquí hay un resumen de uno:

  • Mientras el archivo javascript externo no se cargue de forma asíncrona, _gaq es una matriz utilizada como cola.
  • Los ga.js externos procesan la cola.
  • ga.js luego reemplaza _gaq por un objeto que proporciona un método push.
  • Una vez que _gaq es reemplazado por un objeto, los comandos _gaq.push(/*...*/) ya no necesitan ser diferidos, se pueden ejecutar.

Para quienes se perdieron la parte de carga de la escritura asíncrona, es:

(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); 
})(); 

Usando temporalmente una matriz como una cola y el método de empuje está un gran código. Es una forma muy interesante de hacer frente al hecho de que cuando se ejecuta _gaq.push(/*...*/), no siempre es así si la dependencia ya se ha cargado de forma asíncrona o no.

Otra forma interesante relacionada con la gestión de este tipo de problemas es la new Google Analytics "isogram" snippet: ga(/*...*/) se ve aún más intuitivo para las llamadas que _gaq.push(/*...*/), pero todavía hace frente a las alegrías relacionados con las dependencias de carga de forma asíncrona.

¿Alguien puede explicar para qué sirve?

Espero que mi respuesta anterior lo haya hecho. Lo que quería compartir aquí es que la primera línea se hace de una manera particular para encajar con todo: inicialización que nunca daña si se hace dos veces, uso inteligente del método push ...

hace Google Analytics en un objeto global llamado _gaq?

Sí lo hace, al utilizar este fragmento de ga.js.

Cuestiones relacionadas