谷歌 analytics.js 简要分析
下面是部分翻译过的JS,看起来好看些。
(function () { function setHref(a, b) { return a.href = b; } function setName(a, b) { return a.name = b; } //使用情况的埋点 var allusage = new function () { var array = []; this.set = function (b) { array[b]= true; }; this.usageFlag = function () { for(var b = [], c = 0; c < array.length; c++) { array[c]&& (b[Math.floor(c / 6)] = b[Math.floor(c / 6)] ^ 1 << c % 6); } for (c = 0; c < b.length; c++) { b[c]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(b[c]|| 0); } return b.join("") + "~"; }; }; //设置信息标志 function setMsgCode(a) { allusage.set(a); }; function isFunction(a) { return "function" == typeof a; } function isArray(a) { return "[object Array]" == Object.prototype.toString.call(Object(a)); } function isString(a) { return void 0 != a && - 1 < (a.constructor + "").indexOf("String"); } function inString(a, b) { return 0 == a.indexOf(b); } //去除空格 function removeBlank(a) { return a ? a.replace(/^[\s\xa0]+|[\s\xa0]+$/g, ""): ""; } function Td() { return [roundCode() ^ Mc() & 0x7FFFFFFF, Math.round((new Date).getTime() / 1E3)].join("."); } function createImg(a) { var b = document.createElement("img"); b.width = 1; b.height = 1; b.src = a; return b; } function emptyFunction() { } function encodeUri(a) { if(encodeURIComponent instanceof Function) return encodeURIComponent(a); setMsgCode(28); return a; } //对括号进行编码 function encodeBracket(a) { return encodeUri(a).replace(/\(/g, "%28").replace(/\)/g, "%29"); } var addEvent = function (a, b, c, d) { try { a.addEventListener ? a.addEventListener(b, c, !!d): a.attachEvent && a.attachEvent("on" +b, c); } catch (e) { setMsgCode(27); } }; var removeEvent = function (a, b, c) { a.removeEventListener ? a.removeEventListener(b, c, false): a.detachEvent && a.detachEvent("on" +b, c); }; function createScript(a, b) { if(a) { var c = document.createElement("script"); c.type = "text/javascript"; c.async = true; c.src = a; c.id = b; var d = document.getElementsByTagName("script")[0]; d.parentNode.insertBefore(c, d); } } function getProtocol() { return Ba || "https:" == document.location.protocol ? "https:" : "http:"; } function getHostname() { var a = "" + document.location.hostname; return 0 == a.indexOf("www.") ? a.substring(4): a; } function getReferrer(a) { var b = document.referrer; if (/^https?:\/\//i.test(b)) { if (a) return b; a = "//" + document.location.hostname; var c = b.indexOf(a); if (5 == c || 6 == c) if (a = b.charAt(c +a.length), "/" == a || "?" == a || "" == a || ":" == a) return; return b; } } function preParameters(a, b) { if(1 == b.length && null != b[0] && "object" === typeof b[0]) return b[0]; for (var c = { }, d = Math.min(a.length +1, b.length), e = 0; e < d; e++) if ("object" === typeof b[e]) { for (var g in b[e]) b[e].hasOwnProperty(g) &&(c[g] = b[e][g]); break; } else e < a.length && (c[a[e]]= b[e]); return c; }; //用于存在储键值对应的容器 var kVContainer = function () { this.keys =[]; this.w = { }; this.m = { }; }; kVContainer.prototype.set = function (a, b, c) { this.keys.push(a); c ? this.m[":" +a] = b: this.w[":" +a] = b; }; kVContainer.prototype.get = function (a) { return this.m.hasOwnProperty(":" +a) ? this.m[":" +a] : this.w[":" +a]; }; kVContainer.prototype.map = function (a) { for(var b = 0; b < this.keys.length; b++) { var c = this.keys[b]; var d = this.get(c); d && a(c, d); } }; //是否禁用了跟踪,参见帮助文档 var isDisabledTrack = function (a) { return false; }; var fb = function (a) { setTimeout(a, 100); }; var getCookieValue = function (a) { var b = [], c = document.cookie.split(";"); a = new RegExp("^\\s*" +a + "=\\s*(.*?)\\s*$"); for (var d = 0; d < c.length; d++) { var e = c[d].match(a); e && b.push(e[1]); } return b; }; var getsetCookie = function (a, b, c, d, e, g) { //如果被禁用或自身几个网站,不进行跟踪,返回False e = isDisabledTrack(e) ? false : regDoubleclick.test(document.location.hostname) || "/" == c && regGoogleSite.test(d) ? false : true; if (!e) return false; b && 1200 < b.length && (b = b.substring(0, 1200), setMsgCode(24)); c = a + "=" + b + "; path=" +c + "; "; g && (c += "expires=" +(new Date((new Date).getTime() +g)).toGMTString() + "; "); d && "none" != d && (c += "domain=" +d + ";"); d = document.cookie; document.cookie = c; if (!(d = d != document.cookie)) t: { a = getCookieValue(a); for (d = 0; d < a.length; d++) if (b == a[d]) { d = true; break t; } d = false; } return d; }; var regGoogleSite = new RegExp(/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/); var regDoubleclick = new RegExp(/(^|\.)doubleclick\.net$/i); var Mc = function () { //debugger; for(var a = window.navigator.userAgent + (document.cookie ? document.cookie: "") + (document.referrer ? document.referrer: ""), b = a.length, c = window.history.length; 0 < c;) { a += c-- ^ b++; } return La(a); }; var oc = function () { return getProtocol() + "//localhost:25388"; //return getProtocol() + "//www.google-analytics.com"; }; var lenException = function (a) { setName(this, "len"); this.message = a + "-8192"; }; //firefox error var ff2postException = function (a) { setName(this, "ff2post"); this.message = a + "-2036"; }; //如果支持sendBeacon 就使用它, var sendRequest = function (targetUrl, datas, callback, sendBeaconCallback) { callback = callback || emptyFunction; //优先使用sendBeaconCallback sendBeaconCallback && (sendBeaconCallback = callback, window.navigator.sendBeacon ? window.navigator.sendBeacon(targetUrl, datas) ? (sendBeaconCallback(), sendBeaconCallback = true) : sendBeaconCallback = false : sendBeaconCallback = false); if (!sendBeaconCallback) { if (2036 >= datas.length) { imageRequest(targetUrl, datas, callback); } else if (8192 >= datas.length) { if (0 <= window.navigator.userAgent.indexOf("Firefox") && ![].reduce) { throw new ff2postException(datas.length); } XMLHttpRequest(targetUrl, datas, callback) || XDomainRequest(targetUrl, datas, callback) || IframeRequest(datas, callback) || callback(); } else { throw new lenException(datas.length); } } }; //图片的请求方式 var imageRequest = function (a, b, c) { var d = createImg(a + "?" + b); d.onload = d.onerror = function () { d.onload = null; d.onerror = null; c(); }; }; //XDomainRequest var XDomainRequest = function (a, b, c) { var d; d = window.XDomainRequest; if (!d) return false; d = new d; d.open("POST", a); d.onerror = function () { c(); }; d.onload = c; d.send(b); return true; }; var XMLHttpRequest = function (a, b, c) { var d = window.XMLHttpRequest; if (!d) return false; var e = new d; if (!("withCredentials" in e)) return false; e.open("POST", a, true); e.withCredentials = true; e.setRequestHeader("Content-Type", "text/plain"); e.onreadystatechange = function () { 4 == e.readyState && (c(), e = null); }; e.send(b); return true; }; var IframeRequest = function (a, b) { if(!document.body) return fb(function () { IframeRequest(a, b); }), true; a = encodeURIComponent(a); try { var c = document.createElement('<iframe name="' +a + '"></iframe>'); } catch (d) { c = document.createElement("iframe"), setName(c, a); } c.height = "0"; c.width = "0"; c.style.display = "none"; c.style.visibility = "hidden"; var e = document.location, e = oc() + "/analytics_iframe.html#" + encodeURIComponent(e.protocol + "//" + e.host + "/favicon.ico"), g = function () { c.src = ""; c.parentNode && c.parentNode.removeChild(c); }; addEvent(window, "beforeunload", g); var ca = false, l = 0, k = function () { if(!ca) { try { if (9 < l || c.contentWindow.location.host == document.location.host) { ca = true; g(); removeEvent(window, "beforeunload", g); b(); return; } } catch (a) { } l++; setTimeout(k, 200); } }; addEvent(c, "load", k); document.body.appendChild(c); c.src = e; return true; }; var Ha = function () { this.t =[]; }; Ha.prototype.add = function (a) { this.t.push(a); }; Ha.prototype.D = function (a) { try { for (var b = 0; b < this.t.length; b++) { var c = a.get(this.t[b]); c && isFunction(c) && c.call(window, a); } } catch (d) { } b = a.get(hitCallback); b != emptyFunction && isFunction(b) &&(a.set(hitCallback, emptyFunction, true), setTimeout(b, 10)); }; function checksampler(a) { if(100 != a.get(sampleRate) && La(getStrConfig(a, clientId)) % 1E4 >= 100 * getIntConfig(a, sampleRate)) throw "abort"; } function checkisDisabledTrack(a) { if(isDisabledTrack(getStrConfig(a, trackingId))) throw "abort"; } function checkProtocol() { var a = document.location.protocol; if ("http:" != a && "https:" != a) throw "abort"; } function buildHitTasks(a) { try { window.XMLHttpRequest && "withCredentials" in new window.XMLHttpRequest ? setMsgCode(40): window.XDomainRequest && setMsgCode(41), window.navigator.sendBeacon && setMsgCode(42); } catch (b) { } a.set(stepInPage, getIntConfig(a, stepInPage) +1); var c = []; Qa.map(function(b, d) { if(d.p) { var e = a.get(b); void 0 != e && e != d.defaultValue && ("boolean" == typeof e && (e *= 1), c.push(d.p + "=" + encodeUri("" +e))); } }); if (Ed(new Od(1E4))) { var d = []; d.push(round1()); d.push.apply(d, Td().split(".")); d.push(round2()); var e; e = window.crypto ? true : false; d.push(e ? "c": "b"); c.push("z=" +d.join(".")); } else c.push("z=" +round2()); a.set(hitPayload, c.join("&"), true); } function sendHitTasks(a) { var b = getStrConfig(a, transportUrl) || oc() + "/collect"; sendRequest(b, getStrConfig(a, hitPayload), a.get(hitCallback), a.get(useBeacon)); a.set(hitCallback, emptyFunction, true); } function Hc(a) { var b = window.gaData; b && (b.expId && a.set(Nc, b.expId), b.expVar && a.set(Oc, b.expVar)); } function checkpreviewTask() { if(window.navigator && "preview" == window.navigator.loadPurpose) throw "abort"; } function checkTrackidexist(a) { if(!a.get(trackingId)) throw "abort"; }; var round1 = function () { return Math.round(0x7FFFFFFF * Math.random()); }; var round2 = function () { try { var a = new Uint32Array(1); window.crypto.getRandomValues(a); return a[0]& 0x7FFFFFFF; } catch (b) { return round1(); } }; var roundCode = round1; function Ta(a) { var b = getIntConfig(a, Ua); 500 <= b && setMsgCode(15); var c = getStrConfig(a, hitType); if ("transaction" != c && "item" != c) { var c = getIntConfig(a, Wa), d = (new Date).getTime(), e = getIntConfig(a, Xa); 0 == e && a.set(Xa, d); e = Math.round(2 * (d - e) / 1E3); 0 < e && (c = Math.min(c +e, 20), a.set(Xa, d)); if (0 >= c) throw "abort"; a.set(Wa, --c); } a.set(Ua, ++b); }; var settings = function () { this.data = new kVContainer; }; var Qa = new kVContainer; var Za = []; settings.prototype.get = function (a) { var b = $a(a); var c = this.data.get(a); b && void 0 == c && (c = isFunction(b.defaultValue) ? b.defaultValue(): b.defaultValue); return b && b.n ? b.n(this, a, c): c; }; settings.prototype.set = function (a, b, c) { if(a) if ("object" == typeof a) { for (var d in a) { a.hasOwnProperty(d) && ab(this, d, a[d], c); } } else { ab(this, a, b, c); } }; var getStrConfig = function (a, b) { var c = a.get(b); return void 0 == c ? "" : "" + c; }; var getIntConfig = function (a, b) { var c = a.get(b); return void 0 == c || "" === c ? 0 : 1 * c; }; var ab = function (a, b, c, d) { if(void 0 != c) switch (b) { case trackingId: wb.test(c); } var e = $a(b); e && e.o ? e.o(a, b, c, d): a.data.set(b, c, d); }; var bb = function (aName, bshortName, cdefaultValue, d, e) { setName(this, aName); this.p = bshortName; this.n = d; this.o = e; this.defaultValue = cdefaultValue; }; var $a = function (a) { var b = Qa.get(a); if (!b) for (var c = 0; c < Za.length; c++) { var d = Za[c], e = d[0].exec(a); if (e) { b = d[1](e); Qa.set(b.name, b); break; } } return b; }; var yc = function (a) { var b; Qa.map(function(c, d) { d.p == a && (b = d); }); return b && b.name; }; var S = function (aName, bshortName, cdefaultValue, d, e) { aName = new bb(aName, bshortName, cdefaultValue, d, e); Qa.set(aName.name, aName); return aName.name; }; var cb = function (a, b) { Za.push([new RegExp("^" +a + "$"), b]); }; var T = function (aName, bshortName, cdefaultValue) { return S(aName, bshortName, cdefaultValue, void 0, db); }; var db = function () { }; var WXAnalyticsObjectName = isString(window.WXAnalyticsObject) && removeBlank(window.WXAnalyticsObject) || "wa"; var Ba = false; var apiVersion = T("apiVersion", "v"); var clientVersion = T("clientVersion", "_v"); S("anonymizeIp", "aip"); var hitType = S("hitType", "t"); var hitCallback = S("hitCallback"); var hitPayload = S("hitPayload"); S("nonInteraction", "ni"); S("currencyCode", "cu"); var useBeacon = S("useBeacon", void 0, false); S("dataSource", "ds"); S("sessionControl", "sc", ""); S("sessionGroup", "sg"); S("queueTime", "qt"); var stepInPage = S("_s", "_s"); S("screenName", "cd"); var kb = S("location", "dl", ""); var lb = S("referrer", "dr"); var mb = S("page", "dp", ""); S("hostname", "dh"); var nb = S("language", "ul"); var ob = S("encoding", "de"); S("title", "dt", function () { return document.title || void 0; }); cb("contentGroup([0-9]+)", function (a) { return new bb(a[0], "cg" +a[1]); }); var pb = S("screenColors", "sd"); var qb = S("screenResolution", "sr"); var rb = S("viewportSize", "vp"); var sb = S("javaEnabled", "je"); var tb = S("flashVersion", "fl"); S("campaignId", "ci"); S("campaignName", "cn"); S("campaignSource", "cs"); S("campaignMedium", "cm"); S("campaignKeyword", "ck"); S("campaignContent", "cc"); var ub = S("eventCategory", "ec"); var xb = S("eventAction", "ea"); var yb = S("eventLabel", "el"); var zb = S("eventValue", "ev"); var Bb = S("socialNetwork", "sn"); var Cb = S("socialAction", "sa"); var Db = S("socialTarget", "st"); var Eb = S("l1", "plt"); var Fb = S("l2", "pdt"); var Gb = S("l3", "dns"); var Hb = S("l4", "rrt"); var Ib = S("l5", "srt"); var Jb = S("l6", "tcp"); var Kb = S("l7", "dit"); var Lb = S("l8", "clt"); var Mb = S("timingCategory", "utc"); var Nb = S("timingVar", "utv"); var Ob = S("timingLabel", "utl"); var Pb = S("timingValue", "utt"); S("appName", "an"); S("appVersion", "av", ""); S("appId", "aid", ""); S("appInstallerId", "aiid", ""); S("exDescription", "exd"); S("exFatal", "exf"); var Nc = S("expId", "xid"); var Oc = S("expVar", "xvar"); var Ua = S("_hc", void 0, 0); var Xa = S("_ti", void 0, 0); var Wa = S("_to", void 0, 20); cb("dimension([0-9]+)", function (a) { return new bb(a[0], "cd" +a[1]); }); cb("metric([0-9]+)", function (a) { return new bb(a[0], "cm" +a[1]); }); S("linkerParam", void 0, void 0, Bc, db); var ld = S("usage", "_u", void 0, function () { return allusage.usageFlag(); }, db); S("forceSSL", void 0, void 0, function () { return Ba; }, function (a, b, c) { setMsgCode(34); Ba = !!c; }); //var ed = S("_j1", "jid"); //var Hd = S("_j2", "gjid"); cb("\\&(.*)", function (a) { var b = new bb(a[0], a[1]), c = yc(a[0].substring(1)); c && (b.n = function (a) { return a.get(c); }, b.o = function (a, b, g, ca) { a.set(c, g, ca); }, b.p = void 0); return b; }); var _oot = T("_oot"); var previewTask = S("previewTask"); var checkProtocolTask = S("checkProtocolTask"); var validationTask = S("validationTask"); var checkStorageTask = S("checkStorageTask"); //var historyImportTask = S("historyImportTask"); var samplerTask = S("samplerTask"); var _rlt = T("_rlt"); var buildHitTask = S("buildHitTask"); var sendHitTask = S("sendHitTask"); var ceTask = S("ceTask"); //var devIdTask = S("devIdTask"); var timingTask = S("timingTask"); //var displayFeaturesTask = S("displayFeaturesTask"); var V = T("name"); var clientId = T("clientId", "cid"); var userId = S("userId", "uid"); var trackingId = T("trackingId", "tid"); var cookieName = T("cookieName", void 0, "_wa"); var cookieDomain = T("cookieDomain"); var cookiePath = T("cookiePath", void 0, "/"); var cookieExpires = T("cookieExpires", void 0, 63072E3); var legacyCookieDomain = T("legacyCookieDomain"); //var legacyHistoryImport = T("legacyHistoryImport", void 0, true); var storage = T("storage", void 0, "cookie"); //var allowLinker = T("allowLinker", void 0, false); //var allowAnchor = T("allowAnchor", void 0, true); var sampleRate = T("sampleRate", "sf", 100); var siteSpeedSampleRate = T("siteSpeedSampleRate", void 0, 1); var alwaysSendReferrer = T("alwaysSendReferrer", void 0, false); var transportUrl = S("transportUrl"); //var _r = S("_r", "_r"); //var _dfr = S("_dfr", void 0, 1); function createCommands(commandName, b, c, d) { b[commandName]= function () { try { return d && setMsgCode(d), c.apply(this, arguments); } catch (b) { var g = b && b.name; if (!(1 <= 100 * Math.random() || isDisabledTrack("?"))) { var ca = ["t=error", "_e=exc", "_v=j30", "sr=1"]; commandName && ca.push("_f=" + commandName); g && ca.push("_m=" + encodeUri(g.substring(0, 100))); ca.push("aip=1"); ca.push("z=" +roundCode()); sendRequest(oc() + "/collect", ca.join("&")); } throw b; } }; }; var Od = function (a) { this.V = a; this.fa = void 0; this.$ = false; this.ha = void 0; this.ea = 1; }; var Ed = function (a, b, c) { if(a.fa && a.$) return 0; a.$ = true; if (b) { if (a.ha && getIntConfig(b, a.ha)) return getIntConfig(b, a.ha); if (0 == b.get(siteSpeedSampleRate)) return 0; } if (0 == a.V) return 0; void 0 === c && (c = round2()); return 0 == c % a.V ? Math.floor(c / a.V) % a.ea + 1: 0; }; function flashVersion() { var a, b, c; if ((c = (c = window.navigator) ? c.plugins : null) && c.length) for (var d = 0; d < c.length && !b; d++) { var e = c[d]; -1 < e.name.indexOf("Shockwave Flash") && (b = e.description); } if (!b) try { a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"), b = a.GetVariable("$version"); } catch (g) { } if (!b) try { a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"), b = "WIN 6,0,21,0", a.AllowScriptAccess = "always", b = a.GetVariable("$version"); } catch (ca) { } if (!b) try { a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), b = a.GetVariable("$version"); } catch (l) { } b && (a = b.match(/[\d]+/g)) && 3 <= a.length && (b = a[0] + "." + a[1] + " r" + a[2]); return b || void 0; }; var collectPerformance = function (a, b) { var c = Math.min(getIntConfig(a, siteSpeedSampleRate), 100); if (!(La(getStrConfig(a, clientId)) % 100 >= c) && (c = { }, getperformance(c) || getperformance2(c))) { var d = c[Eb]; void 0 == d || Infinity == d || isNaN(d) || (0 < d ? (Y(c, Gb), Y(c, Jb), Y(c, Ib), Y(c, Fb), Y(c, Hb), Y(c, Kb), Y(c, Lb), b(c)): addEvent(window, "load", function () { collectPerformance(a, b); }, false)); } }; var getperformance = function (a) { var b = window.performance || window.webkitPerformance, b = b && b.timing; if (!b) return false; var c = b.navigationStart; if (0 == c) return false; a[Eb]= b.loadEventStart -c; a[Gb]= b.domainLookupEnd -b.domainLookupStart; a[Jb]= b.connectEnd -b.connectStart; a[Ib]= b.responseStart -b.requestStart; a[Fb]= b.responseEnd -b.responseStart; a[Hb]= b.fetchStart -c; a[Kb]= b.domInteractive -c; a[Lb]= b.domContentLoadedEventStart -c; return true; }; var getperformance2 = function (a) { if(window.top != window) return false; var b = window.external, c = b && b.onloadT; b && !b.isValidLoadTime && (c = void 0); 2147483648 < c && (c = void 0); 0 < c && b.setPageReadyTime(); if (void 0 == c) return false; a[Eb]= c; return true; }; var Y = function (a, b) { var c = a[b]; if (isNaN(c) || Infinity == c || 0 > c) a[b]= void 0; }; var sendTiming = function (a) { return function (b) { "pageview" != b.get(hitType) || a.I || (a.I = true, collectPerformance(b, function (b) { a.send("timing", b); })); }; }; var hc = false; var mc = function (a) { if("cookie" == getStrConfig(a, storage)) { var b = getStrConfig(a, cookieName), c = nd(a), d = kc(getStrConfig(a, cookiePath)), e = lc(getStrConfig(a, cookieDomain)), g = 1E3 * getIntConfig(a, cookieExpires), ca = getStrConfig(a, trackingId); if ("auto" != e) getsetCookie(b, c, d, e, ca, g) && (hc = true); else { setMsgCode(32); var l; t: { c =[]; e = getHostname().split("."); if (4 == e.length && (l = e[e.length -1], parseInt(l, 10) == l)) { l =["none"]; break t; } for (l = e.length -2; 0 <= l; l--) c.push(e.slice(l).join(".")); c.push("none"); l = c; } for (var k = 0; k < l.length; k++) if (e = l[k], a.data.set(cookieDomain, e), c = nd(a), getsetCookie(b, c, d, e, ca, g)) { hc = true; return; } a.data.set(cookieDomain, "auto"); } } }; var checkStorage = function (a) { if("cookie" == getStrConfig(a, storage) && !hc && (mc(a), !hc)) throw "abort"; }; var nd = function (a) { var b = encodeBracket(getStrConfig(a, clientId)); var c = ic(getStrConfig(a, cookieDomain)); a = jc(getStrConfig(a, cookiePath)); 1 < a && (c += "-" + a); return ["MY_A1", c, b].join("."); }; var Gc = function (a, b, c) { for(var d = [], e =[], g, ca = 0; ca < a.length; ca++) { var l = a[ca]; if (l.r[c]== b) d.push(l); else void 0 == g || l.r[c] < g ? (e = [l], g = l.r[c]): l.r[c] == g && e.push(l); } return 0 < d.length ? d: e; }; var lc = function (a) { return 0 == a.indexOf(".") ? a.substr(1): a; }; var ic = function (a) { return lc(a).split(".").length; }; var kc = function (a) { if(!a) return "/"; 1 < a.length && a.lastIndexOf("/") == a.length -1 && (a = a.substr(0, a.length -1)); 0 != a.indexOf("/") &&(a = "/" + a); return a; }; var jc = function (a) { a = kc(a); return "/" == a ? 1 : a.split("/").length; }; function Xc(a, b, c) { "none" == b && (b = ""); var d = [], e = getCookieValue(a); a = "__utma" == a ? 6 : 2; for (var g = 0; g < e.length; g++) { var ca = ("" + e[g]).split("."); ca.length >= a && d.push({ hash: ca[0], R: e[g], O: ca }); } return 0 == d.length ? void 0 : 1 == d.length ? d[0] : Zc(b, d) || Zc(c, d) || Zc(null, d) || d[0]; } function Zc(a, b) { var c, d; null == a ? c = d = 1 : (c = La(a), d = La(inString(a, ".") ? a.substring(1): "." + a)); for (var e = 0; e < b.length; e++) if (b[e].hash == c || b[e].hash == d) return b[e]; }; var od = new RegExp(/^https?:\/\/([^\/:]+)/); var pd = /(.*)([?&#])(?:_wa=[^&#]*)(?:&?)(.*)/; function Bc(a) { a = a.get(clientId); var b = Ic(a, 0); return "_wa=1." + encodeUri(b + "." + a); } function Ic(a, b) { for(var c = new Date, d = window.navigator, e = d.plugins ||[], c =[a, d.userAgent, c.getTimezoneOffset(), c.getYear(), c.getDate(), c.getHours(), c.getMinutes() +b], d = 0; d < e.length; ++d) c.push(e[d].description); return La(c.join(".")); } var Dc = function (a) { setMsgCode(48); this.target = a; this.T = false; }; Dc.prototype.Q = function (a, b) { if(a.tagName) { if ("a" == a.tagName.toLowerCase()) { a.href && setHref(a, qd(this, a.href, b)); return; } if ("form" == a.tagName.toLowerCase()) return rd(this, a); } if ("string" == typeof a) return qd(this, a, b); }; var qd = function (a, b, c) { var d = pd.exec(b); d && 3 <= d.length && (b = d[1] + (d[3] ? d[2] + d[3] : "")); a = a.target.get("linkerParam"); var e = b.indexOf("?"), d = b.indexOf("#"); c ? b += (- 1 == d ? "#" : "&") + a : (c = - 1 == e ? "?" : "&", b = -1 == d ? b + (c + a) : b.substring(0, d) +c + a + b.substring(d)); return b; }; var rd = function (a, b) { if(b && b.action) { var c = a.target.get("linkerParam").split("=")[1]; if ("get" == b.method.toLowerCase()) { for (var d = b.childNodes ||[], e = 0; e < d.length; e++) if ("_wa" == d[e].name) { d[e].setAttribute("value", c); return; } d = document.createElement("input"); d.setAttribute("type", "hidden"); d.setAttribute("name", "_wa"); d.setAttribute("value", c); b.appendChild(d); } else "post" == b.method.toLowerCase() &&(b.action = qd(a, b.action)); } }; Dc.prototype.S = function (a, b, c) { function d(c) { try { c = c || window.event; var d; t: { var g = c.target || c.srcElement; for (c = 100; g && 0 < c;) { if (g.href && g.nodeName.match(/^a(?:rea)?$/i)) { d = g; break t; } g = g.parentNode; c--; } d = { }; } ("http:" == d.protocol || "https:" == d.protocol) && sd(a, d.hostname || "") && d.href && setHref(d, qd(e, d.href, b)); } catch (w) { setMsgCode(26); } } var e = this; this.T || (this.T = true, addEvent(document, "mousedown", d, false), addEvent(document, "touchstart", d, false), addEvent(document, "keyup", d, false)); if (c) { c = function (b) { b = b || window.event; if ((b = b.target || b.srcElement) && b.action) { var c = b.action.match(od); c && sd(a, c[1]) && rd(e, b); } }; for (var g = 0; g < document.forms.length; g++) addEvent(document.forms[g], "submit", c); } }; function sd(a, b) { if(b == document.location.hostname) return false; for (var c = 0; c < a.length; c++) if (a[c]instanceof RegExp) { if (a[c].test(b)) return true; } else if (0 <= b.indexOf(a[c])) return true; return false; }; var wb = /^(UA|YT|MO|GP)-(\d+)-(\d+)$/; var pc = function (a) { function bind(a, b) { d.b.data.set(a, b); } function bindfilters(a, c) { bind(a, c); d.filters.add(a); } var d = this; this.b = new settings; this.filters = new Ha; bind(V, a[V]); bind(trackingId, removeBlank(a[trackingId])); bind(cookieName, a[cookieName]); bind(cookieDomain, a[cookieDomain]|| getHostname()); bind(cookiePath, a[cookiePath]); bind(cookieExpires, a[cookieExpires]); bind(sampleRate, a[sampleRate]); bind(siteSpeedSampleRate, a[siteSpeedSampleRate]); bind(alwaysSendReferrer, a[alwaysSendReferrer]); bind(storage, a[storage]); bind(userId, a[userId]); bind(apiVersion, 1); bind(clientVersion, "j30"); bindfilters(_oot, checkisDisabledTrack); bindfilters(previewTask, checkpreviewTask); bindfilters(checkProtocolTask, checkProtocol); bindfilters(validationTask, checkTrackidexist); bindfilters(checkStorageTask, checkStorage); bindfilters(samplerTask, checksampler); bindfilters(_rlt, Ta); bindfilters(ceTask, Hc); bindfilters(buildHitTask, buildHitTasks); bindfilters(sendHitTask, sendHitTasks); bindfilters(timingTask, sendTiming(this)); Jc(this.b, a[clientId]); preCommRequestArgs(this.b); }; var Jc = function (a, b) { if("cookie" == getStrConfig(a, storage)) { hc = false; var c; i: { var d = getCookieValue(getStrConfig(a, cookieName)); if (d && !(1 > d.length)) { c =[]; for (var e = 0; e < d.length; e++) { var g; g = d[e].split("."); var ca = g.shift(); ("GA1" == ca || "1" == ca) && 1 < g.length ? (ca = g.shift().split("-"), 1 == ca.length && (ca[1] = "1"), ca[0]*= 1, ca[1]*= 1, g = { r: ca, s: g.join(".") }): g = void 0; g && c.push(g); } if (1 == c.length) { setMsgCode(13); c = c[0].s; break i; } if (0 == c.length) setMsgCode(12); else { setMsgCode(14); d = ic(getStrConfig(a, cookieDomain)); c = Gc(c, d, 0); if (1 == c.length) { c = c[0].s; break i; } d = jc(getStrConfig(a, cookiePath)); c = Gc(c, d, 1); c = c[0] && c[0].s; break i; } } c = void 0; } c || (c = getStrConfig(a, cookieDomain), d = getStrConfig(a, legacyCookieDomain) || getHostname(), c = Xc("__utma", d, c), (c = void 0 == c ? void 0 : c.O[1] + "." + c.O[2]) && setMsgCode(10)); c && (a.data.set(clientId, c), hc = true); } b && (setMsgCode(9), a.data.set(clientId, encodeUri(b))); a.get(clientId) || ((c = (c = window.gaGlobal && window.gaGlobal.vid) && - 1 != c.search(/^(?:utma\.)?\d+\.\d+$/) ? c : void 0) ? (setMsgCode(17), a.data.set(clientId, c)): (setMsgCode(8), a.data.set(clientId, Td()))); mc(a); }; //准备通用的请请求参数 var preCommRequestArgs = function (a) { var b = window.navigator, c = window.screen, d = document.location; a.set(lb, getReferrer(a.get(alwaysSendReferrer))); if (d) { var e = d.pathname || ""; "/" != e.charAt(0) &&(setMsgCode(31), e = "/" + e); a.set(kb, d.protocol + "//" + d.hostname +e + d.search); } c && a.set(qb, c.width + "x" + c.height); c && a.set(pb, c.colorDepth + "-bit"); var c = document.documentElement, g = (e = document.body) && e.clientWidth && e.clientHeight, ca =[]; c && c.clientWidth && c.clientHeight && ("CSS1Compat" === document.compatMode || !g) ? ca = [c.clientWidth, c.clientHeight]: g && (ca = [e.clientWidth, e.clientHeight]); c = 0 >= ca[0] || 0 >= ca[1] ? "" : ca.join("x"); a.set(rb, c); a.set(tb, flashVersion()); a.set(ob, document.characterSet || document.charset); a.set(sb, b && "function" === typeof b.javaEnabled && b.javaEnabled() || false); a.set(nb, (b && (b.language || b.browserLanguage) || "").toLowerCase()); }; pc.prototype.get = function (a) { return this.b.get(a); }; pc.prototype.set = function (a, b) { this.b.set(a, b); }; var qc = { pageview: [mb], event: [ub, xb, yb, zb], social: [Bb, Cb, Db], timing: [Mb, Nb, Pb, Ob] }; pc.prototype.send = function (a) { if(!(1 > arguments.length)) { var b, c; if ("string" === typeof arguments[0]) { (b = arguments[0], c =[].slice.call(arguments, 1)); } else { (b = arguments[0]&& arguments[0][hitType], c = arguments); } if (b) { c = preParameters(qc[b]||[], c), c[hitType]= b, this.b.set(c, void 0, true), this.filters.D(this.b), this.b.data.m = { }, setMsgCode(44); } } }; var onPageIsVisibility = function (funcrun) { if("prerender" == document.visibilityState) return false; funcrun(); return true; }; var td = /^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/; var sc = function (a) { if(isFunction(a[0])) this.u = a[0]; else { var b = td.exec(a[0]); null != b && 4 == b.length && (this.c = b[1] || "t0", this.e = b[2] || "", this.d = b[3], this.a =[].slice.call(a, 1), this.e || (this.A = "create" == this.d, this.i = "require" == this.d, this.g = "provide" == this.d, this.ba = "remove" == this.d), this.i && (3 <= this.a.length ? (this.X = this.a[1], this.W = this.a[2]): this.a[1]&& (isString(this.a[1]) ? this.X = this.a[1]: this.W = this.a[1]))); b = a[1]; a = a[2]; if (!this.d) throw "abort"; if (this.i && (!isString(b) || "" == b)) throw "abort"; if (this.g && (!isString(b) || "" == b || !isFunction(a))) throw "abort"; if (ud(this.c) || ud(this.e)) throw "abort"; if (this.g && "t0" != this.c) throw "abort"; } }; function ud(a) { return 0 <= a.indexOf(".") || 0 <= a.indexOf(":"); }; var Yd; var Zd; var $d; Yd = new kVContainer; $d = new kVContainer; Zd = { ec: 45, ecommerce: 46, linkid: 47 }; var tc = function (a, b, c) { b == $ ? setMsgCode(35): b.get(V); var d = Yd.get(a); if (!isFunction(d)) return false; b.plugins_ = b.plugins_ || new kVContainer; if (b.plugins_.get(a)) return true; b.plugins_.set(a, new d(b, c || { })); return true; }; var parseUrl = function (a) { function b(a) { var b = (a.hostname || "").split(":")[0].toLowerCase(), c = (a.protocol || "").toLowerCase(), c = 1 * a.port || ("http:" == c ? 80 : "https:" == c ? 443 : ""); a = a.pathname || ""; inString(a, "/") || (a = "/" + a); return [b, "" +c, a]; } var c = document.createElement("a"); setHref(c, document.location.href); var d = (c.protocol || "").toLowerCase(), e = b(c), g = c.search || "", ca = d + "//" + e[0] + (e[1] ? ":" + e[1] : ""); inString(a, "//") ? a = d + a : inString(a, "/") ? a = ca + a : !a || inString(a, "?") ? a = ca + e[2] + (a || g) : 0 > a.split("/")[0].indexOf(":") &&(a = ca + e[2].substring(0, e[2].lastIndexOf("/")) + "/" + a); setHref(c, a); d = b(c); return { protocol: (c.protocol || "").toLowerCase(), host: d[0], port: d[1], path: d[2], G: c.search || "", url: a || "" }; }; var Z = { wa: function () { Z.f =[]; } }; Z.wa(); Z.D = function (a) { var b = Z.J.apply(Z, arguments), b = Z.f.concat(b); for (Z.f =[]; 0 < b.length && !Z.v(b[0]) && !(b.shift(), 0 < Z.f.length);); Z.f = Z.f.concat(b); }; Z.J = function (a) { for(var b = [], c = 0; c < arguments.length; c++) try { var d = new sc(arguments[c]); if (d.g) Yd.set(d.a[0], d.a[1]); else { if (d.i) { var e = d, g = e.a[0]; if (!isFunction(Yd.get(g)) && !$d.get(g)) { Zd.hasOwnProperty(g) && setMsgCode(Zd[g]); var ca = e.X; !ca && Zd.hasOwnProperty(g) ?(setMsgCode(39), ca = g + ".js") : setMsgCode(43); if (ca) { ca && 0 <= ca.indexOf("/") ||(ca = "/plugins/ua/" +ca); var l = parseUrl(ca); var e = void 0; var k = l.protocol; var w = document.location.protocol; e = "https:" == k || k == w ? true : "http:" != k ? false : "http:" == w; var xd; if (xd = e) { var e = l, be = parseUrl(document.location.href); if (e.G || 0 <= e.url.indexOf("?") || 0 <= e.path.indexOf("://")) xd = false; else if (e.host == be.host && e.port == be.port) xd = true; else { var ce = "http:" == e.protocol ? 80 : 443; xd = "localhost:25388" == e.host && (e.port || ce) == ce && inString(e.path, "/plugins/") ? true : false; } } xd && (createScript(l.url), $d.set(g, true)); } } } b.push(d); } } catch (de) { // throw de; } return b; }; Z.v = function (a) { try { if (a.u) a.u.call(window, $.j("t0")); else { var b = a.c == WXAnalyticsObjectName ? $: $.j(a.c); if (a.A) "t0" == a.c && $.create.apply($, a.a); else if (a.ba) $.remove(a.c); else if (b) if (a.i) { if (!tc(a.a[0], b, a.W)) return true; } else if (a.e) { var c = a.d, d = a.a, e = b.plugins_.get(a.e); e[c].apply(e, d); } else b[a.d].apply(b, a.a); } } catch (g) { // throw g; } }; var $ = function (a) { setMsgCode(1); Z.D.apply(Z, [arguments]); }; $.h = { }; $.P =[]; $.L = 0; $.answer = 42; var uc = [trackingId, cookieDomain, V]; $.create = function (a) { var b = preParameters(uc, [].slice.call(arguments)); b[V]|| (b[V] = "t0"); var c = "" + b[V]; if ($.h[c]) return $.h[c]; b = new pc(b); $.h[c]= b; $.P.push(b); return b; }; $.remove = function (a) { for(var b = 0; b < $.P.length; b++) if ($.P[b].get(V) == a) { $.P.splice(b, 1); $.h[a]= null; break; } }; $.j = function (a) { return $.h[a]; }; $.K = function () { return $.P.slice(0); }; $.N = function () { "wa" != WXAnalyticsObjectName && setMsgCode(49); var a = window[WXAnalyticsObjectName]; if (!a || 42 != a.answer) { $.L = a && a.l; $.loaded = true; var b = window[WXAnalyticsObjectName]= $; createCommands("create", b, b.create, 3); createCommands("remove", b, b.remove); createCommands("getByName", b, b.j, 5); createCommands("getAll", b, b.K, 6); b = pc.prototype; createCommands("get", b, b.get, 7); createCommands("set", b, b.set, 4); createCommands("send", b, b.send, 2); b = settings.prototype; createCommands("get", b, b.get); createCommands("set", b, b.set); (window.waplugins = window.waplugins || { }).Linker = Dc; b = Dc.prototype; Yd.set("linker", Dc); createCommands("decorate", b, b.Q, 20); createCommands("autoLink", b, b.S, 25); //Yd.set("displayfeatures", fd); //Yd.set("adfeatures", Kd); a = a && a.q; if (isArray(a)) { Z.D.apply($, a); } else { setMsgCode(50); } } }; //启动入口 (function () { var a = $.N; if (!onPageIsVisibility(a)) { setMsgCode(16); var b = false; var c = function () { !b && onPageIsVisibility(a) &&(b = true, removeEvent(document, "visibilitychange", c)); }; addEvent(document, "visibilitychange", c); } }) (); //这个是干什么的?我不知道。 function La(a) { var b = 1, c = 0, d; if (a) for (b = 0, d = a.length -1; 0 <= d; d--) { c = a.charCodeAt(d), b = (b << 0x6 & 0xFFFFFFF) +c + (c << 14), c = b & 0xFE00000, b = 0 != c ? b ^ c >> 21 : b; } return b; }; }) (window);
最后说一下,谷歌代码编译工具。
http://closure-compiler.appspot.com/home
编译后,代码长度明显变短了。。。
谷歌 analytics.js 简要分析的更多相关文章
- 谷歌 analytics.js 部分解密版
源:http://www.google-analytics.com/analytics.js (function(){var aa=encodeURIComponent,f=window,ba=set ...
- analytics.js
Analytics.js简介 analytics.js JavaScript代码段是一种可用于衡量用户与您网站的互动情况的全新方式.它与之前的跟踪代码ga.js类似,但为开发者自定义实现方案提供了 ...
- Analytics.js简介
analytics.js JavaScript代码段是一种可用于衡量用户与您网站的互动情况的全新方式.它与之前的跟踪代码ga.js类似,但为开发者自定义实现方案提供了更大的灵活性. analytics ...
- Activity源码简要分析总结
Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...
- Google发布SSLv3漏洞简要分析报告
今天上午,Google发布了一份关于SSLv3漏洞的简要分析报告.根据Google的说法,该漏洞贯穿于所有的SSLv3版本中,利用该漏洞,黑客可以通过中间人攻击等类似的方式(只要劫持到的数据加密两端均 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET ...
- CVE-2015-5122 简要分析(2016.4)
CVE-2015-5122 简要分析 背景 最近在学习Flash漏洞的分析,其与IE漏洞的分析还是有诸多的不同(不便)之处,折腾了一阵子终于克服了没有符号表.Flash的超时定时器等问题.所以找到了去 ...
- Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
原文发表于 2013 年 8 月 28 日 由 三石 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给出了Fork Join的实现.在Java SE 7的API中,多了ForkJoin ...
- [转]Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp85 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给 ...
随机推荐
- JS 用window.open()函数,父级页面如何取到子级页面的返回值?
父窗口:<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> ...
- 中国省市 JS代码
很实用的一段JS代码, 用户注册的时候,选择地址常用到.代码如下: <script language="javascript"> var g_selProvince; ...
- php大力力 [025节] 来不及学习和分类的,大力力认为有价值的一些技术文章合集(大力力二叔公)(2015-08-27)
php大力力 [025节] 来不及学习和分类的,大力力认为有价值的一些技术文章合集(大力力二叔公)(2015-08-27) 比较好的模版 免费模板网,提供大量DIV+CSS布局网页模板下载及后台管理 ...
- Java容器类接口:Iterator,Collection,Map
Iterator Iterator被称为迭代器,是一个对象,它的工作是遍历并选择序列中的对象,可以实现以下一些操作: 使用方法iterator()要求容器返回一个Iterator,Iterator将返 ...
- Node.js +Express+MongoDB+mogoose+ejs+bootstrap+jquery
Node.js + MongoDB 项目实战(二) 创建项目 在项目实战(一)中,已经配置好了开发环境(详见:http://www.cnblogs.com/jameslong/articles/34 ...
- Swift URL Schemes使用
URL Schemes通常用于分享和第三方登录,但有时需要在html跳至APP,或者APP跳至另外一个APP.这时也需要使用URL Schemes. 一.html跳转至APP eg:html跳转至te ...
- SQUID之cache_peer
一共关系到cache_peer/always_direct/never_direct/hierarchy_stoplist/prefer_direct等配置项. squid的使用指南上,关于alway ...
- C#使用指针表达式
如何:获取指针变量的值 使用指针间接运算符可获取位于指针所指向的位置的变量. 表达式采用下面的形式,其中, p 是指针类型: *p; 不能对除指针类型以外的任何类型的表达式使用一元间接寻址运算符. 此 ...
- mysql主从同步报slave_sql_running:no的解决方案
1.没有正确设置server_id(如没有正确设置从配置项) ps:可手动设置server_id 2.slave stop;set global sql_slave_skip_counter=1;sl ...
- TCP的分层结构
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务 ...