2009-07-31 11 views
15

¿Alguien sabe por qué Google Analytics requiere dos etiquetas de script separadas?¿Dos etiquetas de script separadas para Google Analytics?

En concreto, sus instrucciones aconseja a los usuarios para incrustar el siguiente fragmento de código en una página web para fines de seguimiento:

<!-- Google Analytics --> 
<script type="text/javascript"> 
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); 
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); 
</script> 
<script type="text/javascript"> 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

¿Por qué no podían los usuarios utilizar un único bloque de script como el siguiente:

<!-- Google Analytics --> 
<script type="text/javascript"> 
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); 
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

Respuesta

18

<script> etiquetas se ejecutan en secuencia. Un bloque <script> no se puede ejecutar si el anterior no se ha terminado de ejecutar.

La primera etiqueta <script> se encarga de crear la etiqueta Google <script> que cargará el js externo.Después de la primera <script> ha terminado la ejecución, el DOM tiene el siguiente aspecto:

<script></script> <!-- First Script Tag --> 
<script></script> <!-- Google Injected Script --> 
<script></script> <!-- Second Script Tag --> 

Esto garantiza que la segunda <script> etiqueta no se ejecutará hasta que el .js se realiza la carga. Si se combinan el primero y el segundo <script>, esto provocaría que la variable _gat no esté definida (ya que el script de Google inyectado no comenzará a cargarse hasta que el primer script se haya ejecutado).

0

Sospecho que es un intento de evitar problemas oscuros del navegador con el uso de document.write para implementar una etiqueta de script.

+5

Dudo que sea oscuro; Creo que los navegadores solo analizarán la etiqueta del script escrito después de que finalice el bloque del script actual ... Algo relacionado con la ejecución predecible de javascript de un único hilo ... – Stobor

+1

@Stobor: Debería escribir eso como una respuesta. Yo votaría por eso. :) – chaos

0

Por lo que vale, hacemos un uso sustancial del mecanismo onclick = "pageTracker._trackPageview (% filename%)" para rastrear descargas directas de archivos, pero aún así no queremos rastrear la vista de página real hasta que la página tenga completamente cargado. Tenemos que incluir la primera etiqueta en la parte superior de la página para habilitar eso, pero dejamos la llamada final de _trackPageview() al final (bueno, también trabajamos con el bit var pageTracker).

No necesariamente por qué lo descomponen de esa manera, pero lo hace un poco más fácil para nuestros propósitos.

+0

Puede poner todo el código en la parte inferior y configurar los controladores onclick en el código justo después. – Draemon

1

El primer bloque está usando JavaScript para escribir una nueva secuencia de comandos en línea para reemplazar esa etiqueta de secuencia de comandos. Está haciendo un chequeo para ver si está usando "https" en la página solicitada y, de ser así, para usar su url segura para solicitar el script, o su navegador puede mostrar un mensaje que dice "Porciones de esta página no son seguras: mostrar de manera segura ¿artículos?" o rechazar la llamada en absoluto.

Si la segunda etiqueta de secuencia de comandos se incluyó en la primera, se volaría y/o no sería una etiqueta de secuencia de comandos bien formada y su código tendría que entremezclarse con la suya.

De esta forma, puede hacer todas sus llamadas para rastrear la página y establecer propiedades, etc. en sus propios bloques limpiamente y aún funcionar correctamente a través de http y https.

Por lo tanto, cuando la página se representa, el DOM se parecerá a esto después de la primera secuencia se ejecuta (http regular):

<!-- Google Analytics --> 
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script> 

<script type="text/javascript"> 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

Y esto (https):

<!-- Google Analytics --> 
<script src='https://ssl.google-analytics.com/ga.js' type='text/javascript'></script> 

<script type="text/javascript"> 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

Más detalles: http://code.google.com/apis/analytics/docs/tracking/gaTrackingOverview.html

5

document.write ocurre tan pronto como se escribe en el código. Así que si utilizamos el ejemplo "de un bloque de script", el código fuente generado real podría terminar pareciéndose a esto:

<!-- Google Analytics --> 
<script type="text/javascript"> 
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); 
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script> 

Por lo tanto el código var pageTracker = _gat._getTracker("UA-8720817-1"); pageTracker._trackPageview(); fracasarían porque _gat no se definiría hasta que el archivo ga.js está cargado.

¿Tiene sentido?

Cuestiones relacionadas