2010-09-29 2 views
16

In Googles Dokumentation zu anderer Seite navigiert es wird gesagt, dass ein Ereignis kann auf die folgende Art und Weise verfolgt werden:Wie funktioniert Google Analytics verfolgt Ereignisse, wenn der Benutzer innerhalb einer Domäne

<a onclick="_gaq.push(['_trackEvent', 'category', 'action', 'opt_label', opt_value]);">click me</a> 

oder ältere Version:

<a onclick="pageTracker._trackEvent('category', 'action', 'opt_label', opt_value);">click me</a> 

ich war mit Firebug auf die Anfrage suchen, wenn ein Klick auf einen Link gemacht werden, und ich sehe es abgebrochen Anfrage:

http://www.google-analytics.com/__utm.gif?utmwv=4.7.2&utmn=907737223&....

Dies geschieht, weil der Browser das gesamte JavaScript löscht, wenn der Benutzer zu einer neuen Seite navigiert. Wie wird in diesem Fall eine Ereignisverfolgung durchgeführt?

Edit: Da ein Bild mehr als tausend Worte wert sein ... alt text

Wenn ich einen Link firebug klicken zeigt mir diese Folge von Anfragen (hier werden zunächst vier gezeigt, nachdem folgt Anfragen an Seiteninhalt füllen)

+0

Können Sie klarer darüber sein, was Sie damit meinen, dass es sich um eine abgebrochene Anfrage handelt? Das utm.gif sieht wie der Beginn eines richtig geformten Gif-Hits aus. Willst du damit sagen, dass Firebug sagt, dass es das Gif nicht erfolgreich trifft? – Yahel

+0

@yc - Nein. Ich habe das Bild hochgeladen, was Firefebacks zeigt. –

Antwort

17

Das Problem ist, dass es nicht genug Zeit gibt, damit das Skript ausgeführt werden kann, bevor der Benutzer zur nächsten Seite weitergeleitet wird. Was Sie tun können, ist eine Wrapper-Funktion für Ihren GA-Code zu erstellen und im onclick, rufen Sie die Wrapper-Funktion und nachdem der GA-Code in Ihrer Wrapper-Funktion ausgelöst wird, ein Timeout und Update location.href mit der Link-URL. Beispiel:

<a href="somepage.html" onclick="wrapper_function(this,'category', 'action', 'opt_label', 'opt_value');return false;">click me</a> 

<script type='text/javascript'> 
function wrapper_function(that,category,action,opt_label,opt_value) { 
    _gaq.push(['_trackEvent', category, action, opt_label, opt_value]); 
    window.setTimeout("window.location.href='" + that.href + "'", 1000); 
} 
</script> 

Code wird ein wenig auf Ihren Link basiert variieren, aber hoffentlich die Idee, die Sie bekommen - im Grunde wartet es ein wenig, bevor der Benutzer die Ziel-URL unter das Skript einige Zeit ausführen zu geben.

Update: Diese Antwort vor einigen Jahren geschrieben wurde und ziemlich viel ist seitdem passiert ist, aber ich weiterhin Feedback zu bekommen (und upvotes) gelegentlich, so dass ich dachte, dass ich mit neuen Informationen diese Antwort aktualisieren würde. Diese Antwort ist noch machbar, aber wenn Sie Universal Analytics verwenden, gibt es eine hitCallback Funktion. Die hitCallback function is also available to their traditional _gaq (ga.js), aber es ist nicht offiziell dokumentiert.

+1

erstaunlich, ich hatte gerade dieses Problem und googelte diese Antwort 58 Minuten nachdem es beantwortet wurde. ich liebe, wie schnell SO ist! – Ian

+5

Es scheint mir sehr umständlich. Gibt es andere Möglichkeiten, es zu tun? –

+0

Nun, Sie können die Wrapper-Funktion stattdessen mit einem Event-Listener verbinden, um js aus dem Anker-Tag selbst herauszuhalten. Aber es ist immer noch das gleiche Prinzip, etwas Verzögerung einzufügen, bevor man den Benutzer auf die nächste Seite bringt. Dies ist die beste Lösung, die ich bisher gefunden habe. Natürlich bin ich bereit, andere Lösungen zu hören. –

10

Dieses Problem wird in Google's documentation beantwortet:

Verwendung

<script type="text/javascript"> 
function recordOutboundLink(link, category, action) { 
    try { 
    var myTracker=_gat._getTrackerByName(); 
    _gaq.push(['myTracker._trackEvent', ' + category + ', ' + action + ']); 
    setTimeout('document.location = "' + link.href + '"', 100) 
    }catch(err){} 
} 
</script> 

oder

<script type="text/javascript"> 
function recordOutboundLink(link, category, action) { 
    try { 
    var pageTracker=_gat._getTracker("UA-XXXXX-X"); 
    pageTracker._trackEvent(category, action); 
    setTimeout('document.location = "' + link.href + '"', 100) 
    }catch(err){} 
} 
</script> 

Diese mehr oder weniger die gleiche wie die Antwort von Crayon Violet, hat aber ein schöneres Methodennamen und ist die offizielle Lösung von Google empfohlen.

+0

Das Problem mit dieser Lösung ist, dass keine Fehlerschätzung vorliegt. Danke für Ihre Antwort. –

+1

Die Dokumentation wurde jetzt so aktualisiert, dass sie einen Rückruf enthält, so dass es keine willkürliche Verzögerung geben muss. – Mark

+0

Ja, der obige doc-Link wurde aktualisiert, aber beachten Sie, dass er jetzt für den UA-Stil-Code und nicht für den alten _gaq-Code angezeigt wird (obwohl sie immer noch einen Link zu diesem Link auf dieser Seite bereitstellen). Wenn Sie also immer noch die Vor-UA-Syntax verwenden, müssen Sie immer noch Ihr eigenes setTimeout erstellen. –

2

Wie oben ist dies darauf zurückzuführen, dass die Seite vor dem Zurücksenden des Async-Anrufs unloaded ist.Wenn Sie eine kleine Verzögerung implementieren möchten gaq zu ermöglichen, zu synchronisieren, würde ich folgendes vorschlagen:

zuerst einen Link hinzufügen und fügen eine zusätzliche Klasse oder data Attribut:

<a href="xxx" data-track-exit="true">My Link</a> 

Dann in Ihrem Javascript hinzu:

$("a[data-track-exit]").on('click', function(e) { 
    e.preventDefault(); 
    var thatEl = $(this); 
    thatEl.unbind(e.type, arguments.callee); 
    _gaq.push([ "_trackEvent", action, e.type, 'label', 1 ]); 
    setTimeout(function() { 
    thatEl.trigger(event); 
    }, 200); 
}); 

mir wirklich dieses Verhalten nicht gutheißen (zB wenn Sie auf einem anderen Seite auf Ihrer Website gehen, versuchen, die Daten auf dieser Seite zu erfassen), aber es ist eine anständige Notlösung. Dies kann nicht nur für click Ereignisse extrapoliert werden, sondern auch Form Submits und alles andere, die auch eine Seite entladen würde. Hoffe das hilft!

+0

Haben Sie versucht, das Ereignis auf der zweiten Seite zu senden? In GA-Berichten möchten Sie das Ereignis auf dem Bericht der ersten Seite sehen. Theoretisch müssen Sie daher das Ereignis VOR dem Aufrufen eines Seitenaufrufs auf der zweiten Seite verfolgen. Wird es so funktionieren? –

0

Ich hatte das gleiche Problem. Probieren Sie dieses, es funktioniert für mich. Sieht so aus, als ob ga keine Zahlen als Label-Wert hat. Also wandle es in eine Zeichenfolge um.

trackEvent: function(category, action, opt_label, opt_value){ 
    if(typeof opt_label === 'undefined') opt_label = ''; 
    if(typeof opt_value === 'undefined') opt_value = 1; 
    _gaq.push([ 
     '_trackEvent', 
     String(category), 
     String(action), 
     String(opt_label), 
     opt_value 
    ]); 
}