1 | (function(win, doc, navigator) {
|
2 | var screen = win.screen;
|
3 | var encode = encodeURIComponent;
|
4 | var max = Math.max;
|
5 |
|
6 | var performance = win.performance;
|
7 | var timing = performance && performance.timing;
|
8 |
|
9 | var pvData = {
|
10 | dt: doc.title,
|
11 | de: doc.characterSet || doc.charset,
|
12 | dr: doc.referrer || void 0,
|
13 | ul:
|
14 | navigator.language ||
|
15 | navigator.browserLanguage ||
|
16 | navigator.userLanguage ||
|
17 | void 0,
|
18 | sd: screen.colorDepth + "-bit",
|
19 | sr: screen.width + "x" + screen.height,
|
20 | vp:
|
21 | max(doc.documentElement.clientWidth, win.innerWidth || 0) +
|
22 | "x" +
|
23 | max(doc.documentElement.clientHeight, win.innerHeight || 0),
|
24 | ga: win.ga_tid,
|
25 | z: new Date().getTime()
|
26 | };
|
27 |
|
28 | function buildQueryString(params) {
|
29 | var qs = [];
|
30 | for (var k in params) {
|
31 | if (params.hasOwnProperty(k) && params[k] !== void 0) {
|
32 | qs.push(encode(k) + "=" + encode(params[k]));
|
33 | }
|
34 | }
|
35 | return qs.join("&");
|
36 | }
|
37 |
|
38 | function sendViaImg(uri, params) {
|
39 | var img = new Image();
|
40 |
|
41 | img.src = uri + "?" + buildQueryString(params);
|
42 | }
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | function send(uri, params) {
|
50 | uri = win.ga_url + uri;
|
51 |
|
52 | sendViaImg(uri, params);
|
53 |
|
54 | }
|
55 |
|
56 | function sendTiming() {
|
57 | if (!timing) { return; }
|
58 | var navigationStart = timing.navigationStart;
|
59 | if (navigationStart == 0) { return; }
|
60 |
|
61 | var filterNumber = function (num) { return isNaN(num) || num == Infinity || num < 0 ? void 0 : num; };
|
62 |
|
63 | var perfData = {
|
64 | plt: filterNumber(timing.loadEventStart - navigationStart),
|
65 | dns: filterNumber(timing.domainLookupEnd - timing.domainLookupStart),
|
66 | pdt: filterNumber(timing.responseEnd - timing.responseStart),
|
67 | rrt: filterNumber(timing.redirectEnd - timing.redirectStart),
|
68 | tcp: filterNumber(timing.connectEnd - timing.connectStart),
|
69 | srt: filterNumber(timing.responseStart - timing.requestStart),
|
70 | dit: filterNumber(timing.domInteractive - navigationStart),
|
71 | clt: filterNumber(timing.domContentLoadedEventStart - navigationStart)
|
72 | };
|
73 |
|
74 | for (var key in pvData) {
|
75 | perfData[key] = pvData[key];
|
76 | }
|
77 |
|
78 | send("/t", perfData);
|
79 | }
|
80 |
|
81 |
|
82 | send("/p", pvData);
|
83 |
|
84 | if (document.readyState == "complete") {
|
85 | sendTiming();
|
86 | } else {
|
87 | win.addEventListener("load", sendTiming);
|
88 | }
|
89 | })(window, document, navigator);
|