Google Analytics początkowo używa numeru _gaq
[object Array]
. Przekazywanie tablicy do funkcji odbywa się w JavaScript, przechodząc przez obiekt, a więc przez odwołanie.Dlaczego zmiany prototypów nie są przekazywane przez odwołanie do metody?
(Edit: Jak wskazano w odpowiedzi, odwołanie jest przekazywane przez wartość Zobacz https://stackoverflow.com/a/5314911/120521 więcej szczegółów na temat odniesienia/wartość przechodzącej w JavaScript.). Poniżej
Kod wykorzystuje jQuery czekać DOM załadować, a następnie dołączyć wydarzenie change
, które wyśle wirtualną odsłonę do Google Analytics po zmianie przez użytkownika pola <input/>
.
var _gaq = _gaq || [];
_gaq.push(['_setAccount', _gAAccount]);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();
var Tracking = {
trackInputs: function ($, gaObject) {
var inputs = $('#signUp').find('input');
inputs.bind('change', function() {
gaObject.push(['_trackPageview', '/virtual/input']);
console.log(gaObject); // Outputs:
// [Array[2], Array[1], Array[2]]
// i.e. _setAccount, _trackPageview,
// and _trackPageview calls.
});
}
};
jQuery(document).ready(function($) {
Tracking.trackInputs($, _gaq);
});
// ... DOM begins below
Jednakże, jak to widać w komentarzu powyżej, sposób trackInputs()
drukuje „pierwotnym” tablicę. Zazwyczaj skrypt Google Analytics zmienia tablicę _gaq
w obiekt _gaq
i zmienia prototyp wypychania obiektu, aby po wywołaniu nowego wywołania kierował on żądania do serwerów Google Analytics.
Dlaczego ta zmiana nie została również przekazana przez odniesienie do trackInputs()
?
Zdaję sobie sprawę załadowany skrypt Google Analytics (lub będzie?) Występują po definicji Tracking.trackInputs()
, więc przeglądarka może nie zrozumieć, to jest teraz [object object]
ale utrzymują się myśląc, że to oryginalny [object Array]
. Ale to już nie jest odniesienie, prawda?
(Używanie obiektu _gaq
globalnie (nie przekazując je do sposobu w ogóle) będzie rozwiązać ten problem, ale chcę, aby zrozumieć, dlaczego to nie działa.)
-1 pojawia się problem semantyczny, ale nie próbujesz rozwiązać pytania –
Jeśli powiem, że "silnik samochodu działa poprzez fuzję jądrową, ale nie rozumiem, jak to działa, gdy wkładam gaz do samochodu", a ty odpowiedź "samochody nie działają na fuzję jądrową", czy naprawdę nie ma powodu, aby odpowiedzieć na drugą część pytania? – hvgotcodes
"Gdzie to robi?" - w ga.js – joakimdahlstrom