2017-08-21 3 views
0

Ich versuche, einige benutzerdefinierte Javascript in einer selbst ausgeführten anonymous-Funktion zu schreiben. Dieses benutzerdefinierte JavaScript muss mit der globalen Google Analytics-Funktion ga interagieren, die beim Laden der Google Analytics-Bibliothek erstellt wird. Der folgende Code ist in der <head> der Seite Laden der Bibliothek:Javascript Google Analytics in selbstausführenden anonymen Funktion

<script> 
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 

    ga('create', 'UA-XXXXXXXX-X', 'auto'); 
</script> 

Am unteren Rand der Seite, meine benutzerdefinierte Javascript geladen wird. Dies ist der Code:

(function($, MutationObserver, shippingMethods, ga) { 

    function triggerPageview(path) { 
     ga('send', 'pageview', path); 
    } 

})(jQuery, MutationObserver, shippingMethods, ga); 

Was ich finde, ist, dass der aktuelle Code nicht erfolgreich einen Seitenaufruf auslösen. Die Seitenzugriff nur dann ausgelöst wird, wenn ich ga aus den Argumenten entfernen, wie folgt aus:

(function($, MutationObserver, shippingMethods) { 

    function triggerPageview(path) { 
     ga('send', 'pageview', path); 
    } 

})(jQuery, MutationObserver, shippingMethods); 

Der obige Code funktioniert, hat das erste Beispiel nicht. Ich gehe davon aus, dass ich falsch verstehe, wie diese Argumente für eine selbst-ausführende anonyme Funktion funktionieren sollen. Ich vermute, dass der Wert ga ein Wert ist, wenn die Selbstausführungsfunktion ausgeführt wird, bevor die externe Google Analytics-Bibliothek geladen wird. Ich dachte jedoch, dass nach dem Laden der Bibliothek, und ga aktualisiert wird, dass die ga innerhalb meiner Funktion auch aktualisiert werden würde. Ist das nicht wahr?

angemeldet ich den Wert ga vor dem Seitenzugriff ausgelöst wird, in, zuerst mit ga bestanden vergleichen:

(function($, MutationObserver, shippingMethods, ga) { 

    function triggerPageview(path) { 
     console.log(ga); 
     ga('send', 'pageview', path); 
    } 

})(jQuery, MutationObserver, shippingMethods, ga); 

This Protokolle:

ƒ(){ 
    (i[r].q=i[r].q||[]).push(arguments)} 

Dann ga Argument ohne:

(function($, MutationObserver, shippingMethods) { 

    function triggerPageview(path) { 
     console.log(ga); 
     ga('send', 'pageview', path); 
    } 

})(jQuery, MutationObserver, shippingMethods); 

Diese Protokolle:

ƒ (a){J(1);Z.D.apply(Z,[arguments])} 

So, es scheint, ich bin definitiv etwas falsch zu verstehen. Kann mir jemand erklären, was hier vor sich geht? Was ist der "richtige" Weg, um auf einen globalen Code innerhalb des benutzerdefinierten Codes zu verweisen, den ich zeige?

Wenn ich ga in meine Funktion überlasse, macht es eine "Kopie" des aktuellen Werts von ga, anstatt auf die globale Variable ga zu verweisen?

Antwort

0

Ich glaube, ich habe meine eigene Frage beantwortet. Korrigieren Sie mich, wenn ich falsch liege, aber auf der Grundlage der docs hier:

https://developers.google.com/analytics/devguides/collection/analyticsjs/how-analyticsjs-works

denke ich Google Analytics die ga Befehl, nachdem die Bibliothek lädt neu definiert. Also verweist meine Funktion immer noch auf die ursprünglich definierte ga Methode, aber das globale ga wurde neu definiert. In diesem Fall scheint es das Beste zu sein, das Argument ga nicht zu übergeben und stattdessen immer nur auf window.ga zu verweisen.

Verwandte Themen