立即使用构造函数/ Universal Analytics

时间:2015-09-27 12:46:24

标签: javascript google-analytics universal-analytics event-tracking

我正在试图弄清楚跟踪/分析脚本的工作原理。有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);

1 个答案:

答案 0 :(得分:1)

该函数仅将所有调用参数推送到数组中。它后来由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函数似乎正在执行你的参数。其中使用更多缩小的功能。我建议你继续看这里。