15 Stimmen

Zwei separate Skript-Tags für Google Analytics?

Weiß jemand, warum Google Analytics zwei separate Skript-Tags benötigt?

Konkret raten sie den Nutzern, den folgenden Codeschnipsel zu Tracking-Zwecken in eine Webseite 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 können die Benutzer nicht nur einen Skriptblock wie diesen 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>

18voto

Andrew Moore Punkte 90339

<script> Tags werden nacheinander ausgeführt. A <script> Block kann nicht ausgeführt werden, wenn der vorherige Block noch nicht abgeschlossen ist.

Die erste <script> Tag ist verantwortlich für die Erstellung der Google <script> Tag, der die externen Js lädt. Nach dem ersten <script> beendet ist, sieht das 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 wird nicht ausgeführt, bis die .js mit dem Laden fertig ist. Wenn die erste und zweite <script> kombiniert werden würden, würde dies dazu führen, dass die _gat undefiniert sein (da das von Google eingeschleuste Skript erst zu laden beginnt, wenn das erste Skript fertig ausgeführt ist).

5voto

Jason Berry Punkte 2469

document.write erfolgt, sobald er im Code ausgeführt wird. Wenn wir also Ihr "ein Skriptblock"-Beispiel verwenden, würde der tatsächlich generierte Quellcode wie folgt aussehen:

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

Daher ist die var pageTracker = _gat._getTracker("UA-8720817-1"); pageTracker._trackPageview(); Code würde fehlschlagen, weil _gat wird erst definiert, wenn die Datei ga.js geladen wird.

Ergibt das einen Sinn?

1voto

Tony Heupel Punkte 1033

Der erste Block verwendet JavaScript, um ein ganz neues Skript-Tag inline zu schreiben, das dieses Skript-Tag ersetzt. Er prüft, ob Sie auf der angeforderten Seite "https" verwenden, und wenn ja, ob die sichere URL für die Anforderung des Skripts zu verwenden ist. Andernfalls kann Ihr Browser die Meldung "Teile dieser Seite sind unsicher " anzeigen oder den Aufruf überhaupt verweigern.

Wenn das zweite Skript-Tag im ersten enthalten wäre, würde es weggeblasen werden und/oder kein wohlgeformtes Skript-Tag sein, und Ihr Code müsste sich mit dem ihren vermischen.

Auf diese Weise können Sie alle Aufrufe von trackPageView und das Festlegen von Eigenschaften usw. in Ihren eigenen Blöcken sauber durchführen und trotzdem über http und https korrekt arbeiten.

Wenn die Seite also gerendert wird, sieht das DOM nach der Ausführung des ersten Skripts (reguläres http) so aus:

<!-- 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 dies (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 Einzelheiten: http://code.google.com/apis/analytics/docs/tracking/gaTrackingOverview.html

0voto

chaos Punkte 118918

Ich vermute, dass dies ein Versuch ist, obskure Browser-Probleme mit der Verwendung von document.write um ein Skript-Tag einzusetzen.

0voto

cori Punkte 8388

Wir nutzen den onclick="pageTracker._trackPageview(%filename%)"-Mechanismus, um direkte Dateidownloads zu verfolgen, wollen aber den tatsächlichen Seitenaufruf erst dann verfolgen, wenn die Seite vollständig geladen ist. Um dies zu ermöglichen, müssen wir den 1. Tag oben auf der Seite einfügen, aber den abschließenden _trackPageview()-Aufruf am Ende lassen (das gilt auch für den var pageTracker-Teil).

Nicht unbedingt warum Sie unterteilen es auf diese Weise, aber es macht es für unsere Zwecke etwas einfacher.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X