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

Específicamente, sus instrucciones aconsejan a los usuarios 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é los usuarios no pueden usar solo un bloque de script como este?

<!-- 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>
15
Crashalot 31 jul. 2009 a las 04:02

5 respuestas

La mejor respuesta

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

La primera etiqueta <script> se encarga de crear la etiqueta Google <script> que cargará los js externos. Después de que se termine de ejecutar el primer <script>, 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 etiqueta <script> no se ejecutará hasta que .js termine de cargarse. Si el primer y el segundo <script> se combinan, esto provocaría que la variable _gat no esté definida (ya que el script inyectado por Google no comenzará a cargarse hasta que el primer script se haya ejecutado).

18
Andrew Moore 31 jul. 2009 a las 00:39

El primer bloque está usando JavaScript para escribir una etiqueta de script completamente nueva en línea para reemplazar esa etiqueta de script. Se está realizando una comprobación para ver si está utilizando "https" en la página que se solicita y, en caso afirmativo, para usar su URL segura para solicitar el script, o su navegador puede mostrar un mensaje "Algunas partes de esta página no son seguras. ¿artículos?" o rechazar la llamada en absoluto.

Si la segunda etiqueta de script se incluyera en la primera, quedaría impresionado y / o no sería una etiqueta de script bien formada y su código tendría que mezclarse con el de ellos.

De esta manera, puede hacer todas sus llamadas para rastrearPageView y establecer propiedades, etc. en sus propios bloques de manera limpia y seguir funcionando correctamente a través de http y https.

Entonces, cuando la página se procesa, el DOM se verá así después de que se ejecute el primer script (http normal):

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

1
Tony Heupel 31 jul. 2009 a las 00:35

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

0
chaos 31 jul. 2009 a las 00:08

Para lo que vale, hacemos un uso sustancial del mecanismo onclick = "pageTracker._trackPageview (% filename%)" para rastrear descargas directas de archivos, pero aún no queremos rastrear la vista de página real hasta que la página se haya cargado por completo. Tenemos que incluir la primera etiqueta en la parte superior de la página para habilitar eso, pero dejar la última llamada _trackPageview () al final (bueno, también con el bit var PageTracker).

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

0
cori 31 jul. 2009 a las 00:21

document.write ocurre tan pronto como se ejecuta en código. Entonces, si utilizamos su ejemplo de "bloque de secuencia de comandos única", el código fuente generado real terminaría luciendo así:

<!-- 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(); fallaría porque _gat no se definiría hasta que se cargue el archivo ga.js.

¿Tiene sentido?

5
Jason Berry 31 jul. 2009 a las 00:23