2009-07-31 3 views
15

Wer weiß, warum Google Analytics zwei separate Skript-Tags benötigt?Zwei separate Skript-Tags für Google Analytics?

Insbesondere ihre Anweisungen raten Benutzern den folgenden Code-Schnipsel in eine Webseite zu Tracking-Zwecken einzubetten:

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

Warum konnten Benutzer nicht nur ein Skriptblock wie folgt verwenden:

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

Antwort

18

<script> Tags werden nacheinander ausgeführt. Ein <script> Block kann nicht ausgeführt werden, wenn der vorherige nicht ausgeführt wird.

Die erste <script>-Tag ist verantwortlich für die Erstellung der Google <script>-Tag, die die externe js laden wird.Nachdem der erste <script> Ausführung beendet ist, sucht der DOM wie folgt aus:

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

Dies garantiert, dass die zweite <script> Tag ausgeführt wird erst die .js fertig geladen ist. Wenn der erste und der zweite <script> kombiniert würden, würde dies dazu führen, dass die Variable _gat undefiniert ist (da das von Google injizierte Skript erst dann geladen wird, wenn das erste Skript ausgeführt wird).

0

Ich vermute, es ist ein Versuch, obskure Browser-Probleme mit der Verwendung von document.write zu vermeiden, ein Skript-Tag zu implementieren.

+5

Ich bezweifle, dass es obskur ist; Ich glaube, dass Browser das geschriebene Skript-Tag nur analysieren werden, nachdem der aktuelle Skriptblock beendet ist ... Etwas, das mit vorhersagbarer single-threaded Javascript-Ausführung zu tun hat ... – Stobor

+1

@Stobor: Sie sollten das als Antwort aufschreiben. Ich würde dafür stimmen. :) – chaos

0

Für was es wert ist, verwenden wir den Mechanismus onclick = "pageTracker._trackPageview (% filename%)", um direkte Dateidownloads zu verfolgen, wollen aber den tatsächlichen Seitenaufruf solange nicht verfolgen, bis die Seite komplett ist geladen. Wir müssen das erste Tag oben auf der Seite einfügen, um das zu aktivieren, aber den letzten _trackPageview() -Aufruf am Ende lassen (naja, wir haben auch viel mit dem var pageTracker-Bit zu tun).

Nicht unbedingt warum sie brechen es auf diese Weise, aber es macht es ein wenig einfacher für unsere Zwecke.

+0

Sie können den gesamten Code an der Unterseite setzen, und setzen Sie die onclick Handler in Code unmittelbar danach. – Draemon

1

Der erste Block verwendet tatsächlich JavaScript, um ein ganz neues Skript-Tag inline zu schreiben, um dieses Skript-Tag zu ersetzen. Es wird überprüft, ob Sie "https" auf der angeforderten Seite verwenden und wenn dies der Fall ist, verwenden Sie ihre sichere URL, um das Skript anzufordern, oder Ihr Browser zeigt möglicherweise "Teile dieser Seite sind unsicher - sichere Anzeige an." Artikel?" oder den Anruf überhaupt ablehnen.

Wenn das zweite Skript-Tag im ersten enthalten wäre, wäre es weggeblasen und/oder kein gut formatierter Skript-Tag und Ihr Code müsste sich mit dem Code mischen.

Auf diese Weise können Sie einfach alle Aufrufe von trackPageView ausführen und Eigenschaften usw. in Ihren eigenen Blöcken sauber festlegen und dennoch ordnungsgemäß über http und https arbeiten.

Also, wenn die Seite macht, wird das DOM nach dem ersten Skript wie folgt aussehen ausführt (regular http):

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

Und das (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> 

Weitere Details: http://code.google.com/apis/analytics/docs/tracking/gaTrackingOverview.html

5

document.write tritt auf, sobald es in Code ausgeführt wird. Also, wenn wir Ihre „ein Script-Block“ Beispiel verwendet wird, die tatsächliche generierten Quellcode würde am Ende wie folgt suchen:

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

Daraus ergibt sich die var pageTracker = _gat._getTracker("UA-8720817-1"); pageTracker._trackPageview(); Code würde scheitern, weil _gat würde nicht bis zur ga.js-Datei definiert werden ist geladen.

Macht das Sinn?