使用构造函数立即调用函数/Universal Analytics
Immediately invoked functions with constructors / Universal Analytics
我正在尝试了解跟踪/分析脚本的工作原理。 the Google Analytics code:
有一个优化版本
<script>
(function(window, document, variableName, scriptElement, firstScript) {
window['GoogleAnalyticsObject'] = variableName;
window[variableName] || (window[variableName] = function() {
(window[variableName].q = window[variableName].q || []).push(arguments);
});
window[variableName].l = +new Date;
scriptElement = document.createElement('script'),
firstScript = document.scripts[0];
scriptElement.src = 'https://127.0.0.1:3000/analytics.js';
firstScript.parentNode.insertBefore(scriptElement, firstScript)
}(window, document, 'ga'));
ga('create', 'UA-XXXX-Y');
ga('send', 'pageview');
</script>
加载自定义脚本,我无法理解 ga() 函数的工作原理。我已经尝试了各种 IIFE 和构造函数,但没有得到 'create' 和 'send' 事件。
如何在服务器上查看这些事件?
更新
我设法抽象出队列的方式,现在想知道如何创建一个异步队列来将这些事件发送到服务器。有什么建议吗?
(function() {
var ga = function(a) {
return void 0 != a && -1 < (a.constructor + '').indexOf('String');
};
var sa = function(a) {
return a ? a.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '') : '';
};
var gb = ga(window.GoogleAnalyticsObject) && sa(window.GoogleAnalyticsObject) || 'ga';
var Window = window;
var Document = document;
console.log(Window[gb].q);
})(window);
该函数只是将所有调用参数推入一个数组。它后来被 analytics.js
到 window.GoogleAnalyticsObject
选中。 Google 似乎没有提供 analytics.js
的非缩小版本,但快速美化和搜索最终得到:
var gb = qa(window.GoogleAnalyticsObject) && sa(window.GoogleAnalyticsObject) || "ga"
qa
检查它是否是字符串,sa
函数只是稍微清除名称。
那么,他们还会在哪里使用 gb
?分配只发生在其他地方:
N.N
函数:
N.N = function() {
"ga" != gb && J(49);
var a = O[gb];
if (!a || 42 != a.answer) {
N.L = a && a.l;
N.loaded = !0;
var b = O[gb] = N;
X("create", b, b.create);
X("remove", b, b.remove);
X("getByName", b, b.j, 5);
X("getAll", b, b.getAll, 6);
b = pc.prototype;
X("get", b, b.get, 7);
X("set", b, b.set, 4);
X("send", b, b.send);
b = Ya.prototype;
X("get", b, b.get);
X("set", b, b.set);
if (!Ud() && !Ba) {
a: {
for (var b = M.getElementsByTagName("script"), c = 0; c < b.length && 100 > c; c++) {
var d = b[c].src;
if (d && 0 == d.indexOf("https://www.google-analytics.com/analytics")) {
J(33);
b = !0;
break a
}
}
b = !1
}
b && (Ba = !0)
}
Ud() || Ba || !Ed(new Od) || (J(36), Ba = !0);
(O.gaplugins = O.gaplugins || {}).Linker = Dc;
b = Dc.prototype;
Yd.set("linker", Dc);
X("decorate", b, b.ca, 20);
X("autoLink", b, b.S, 25);
Yd.set("displayfeatures", fd);
Yd.set("adfeatures", fd);
a = a && a.q;
ka(a) ? Z.D.apply(N, a) : J(50)
}
};
分配发生在:
var a = O[gb]; //O is window
您在脚本中使用的 ga
功能很快将被其他功能取代 (N
):
var b = O[gb] = N;
这是 N:
var N = function(a) {
J(1);
Z.D.apply(Z, [arguments])
};
队列在哪里使用?
a = a && a.q;
ka(a) ? Z.D.apply(N, a) : J(50)
Z.D
函数似乎是执行您的参数的函数。它使用了更多的缩小功能。我建议你从这里继续看。
我正在尝试了解跟踪/分析脚本的工作原理。 the Google Analytics code:
有一个优化版本<script>
(function(window, document, variableName, scriptElement, firstScript) {
window['GoogleAnalyticsObject'] = variableName;
window[variableName] || (window[variableName] = function() {
(window[variableName].q = window[variableName].q || []).push(arguments);
});
window[variableName].l = +new Date;
scriptElement = document.createElement('script'),
firstScript = document.scripts[0];
scriptElement.src = 'https://127.0.0.1:3000/analytics.js';
firstScript.parentNode.insertBefore(scriptElement, firstScript)
}(window, document, 'ga'));
ga('create', 'UA-XXXX-Y');
ga('send', 'pageview');
</script>
加载自定义脚本,我无法理解 ga() 函数的工作原理。我已经尝试了各种 IIFE 和构造函数,但没有得到 'create' 和 'send' 事件。
如何在服务器上查看这些事件?
更新
我设法抽象出队列的方式,现在想知道如何创建一个异步队列来将这些事件发送到服务器。有什么建议吗?
(function() {
var ga = function(a) {
return void 0 != a && -1 < (a.constructor + '').indexOf('String');
};
var sa = function(a) {
return a ? a.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '') : '';
};
var gb = ga(window.GoogleAnalyticsObject) && sa(window.GoogleAnalyticsObject) || 'ga';
var Window = window;
var Document = document;
console.log(Window[gb].q);
})(window);
该函数只是将所有调用参数推入一个数组。它后来被 analytics.js
到 window.GoogleAnalyticsObject
选中。 Google 似乎没有提供 analytics.js
的非缩小版本,但快速美化和搜索最终得到:
var gb = qa(window.GoogleAnalyticsObject) && sa(window.GoogleAnalyticsObject) || "ga"
qa
检查它是否是字符串,sa
函数只是稍微清除名称。
那么,他们还会在哪里使用 gb
?分配只发生在其他地方:
N.N
函数:
N.N = function() {
"ga" != gb && J(49);
var a = O[gb];
if (!a || 42 != a.answer) {
N.L = a && a.l;
N.loaded = !0;
var b = O[gb] = N;
X("create", b, b.create);
X("remove", b, b.remove);
X("getByName", b, b.j, 5);
X("getAll", b, b.getAll, 6);
b = pc.prototype;
X("get", b, b.get, 7);
X("set", b, b.set, 4);
X("send", b, b.send);
b = Ya.prototype;
X("get", b, b.get);
X("set", b, b.set);
if (!Ud() && !Ba) {
a: {
for (var b = M.getElementsByTagName("script"), c = 0; c < b.length && 100 > c; c++) {
var d = b[c].src;
if (d && 0 == d.indexOf("https://www.google-analytics.com/analytics")) {
J(33);
b = !0;
break a
}
}
b = !1
}
b && (Ba = !0)
}
Ud() || Ba || !Ed(new Od) || (J(36), Ba = !0);
(O.gaplugins = O.gaplugins || {}).Linker = Dc;
b = Dc.prototype;
Yd.set("linker", Dc);
X("decorate", b, b.ca, 20);
X("autoLink", b, b.S, 25);
Yd.set("displayfeatures", fd);
Yd.set("adfeatures", fd);
a = a && a.q;
ka(a) ? Z.D.apply(N, a) : J(50)
}
};
分配发生在:
var a = O[gb]; //O is window
您在脚本中使用的 ga
功能很快将被其他功能取代 (N
):
var b = O[gb] = N;
这是 N:
var N = function(a) {
J(1);
Z.D.apply(Z, [arguments])
};
队列在哪里使用?
a = a && a.q;
ka(a) ? Z.D.apply(N, a) : J(50)
Z.D
函数似乎是执行您的参数的函数。它使用了更多的缩小功能。我建议你从这里继续看。