提交 | 用户 | 时间
|
58d006
|
1 |
(function() { |
A |
2 |
var AjaxMonitor, Bar, DocumentMonitor, ElementMonitor, ElementTracker, EventLagMonitor, Evented, Events, NoTargetError, Pace, RequestIntercept, SOURCE_KEYS, Scaler, SocketRequestTracker, XHRRequestTracker, animation, avgAmplitude, bar, cancelAnimation, cancelAnimationFrame, defaultOptions, extend, extendNative, getFromDOM, getIntercept, handlePushState, ignoreStack, init, now, options, requestAnimationFrame, result, runAnimation, scalers, shouldIgnoreURL, shouldTrack, source, sources, uniScaler, _WebSocket, _XDomainRequest, _XMLHttpRequest, _i, _intercept, _len, _pushState, _ref, _ref1, _replaceState, |
|
3 |
__slice = [].slice, |
|
4 |
__hasProp = {}.hasOwnProperty, |
|
5 |
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, |
|
6 |
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; |
|
7 |
|
|
8 |
defaultOptions = { |
|
9 |
catchupTime: 100, |
|
10 |
initialRate: .03, |
|
11 |
minTime: 250, |
|
12 |
ghostTime: 100, |
|
13 |
maxProgressPerFrame: 20, |
|
14 |
easeFactor: 1.25, |
|
15 |
startOnPageLoad: true, |
|
16 |
restartOnPushState: true, |
|
17 |
restartOnRequestAfter: 500, |
|
18 |
target: 'body', |
|
19 |
elements: { |
|
20 |
checkInterval: 100, |
|
21 |
selectors: ['body'] |
|
22 |
}, |
|
23 |
eventLag: { |
|
24 |
minSamples: 10, |
|
25 |
sampleCount: 3, |
|
26 |
lagThreshold: 3 |
|
27 |
}, |
|
28 |
ajax: { |
|
29 |
trackMethods: ['GET'], |
|
30 |
trackWebSockets: true, |
|
31 |
ignoreURLs: [] |
|
32 |
} |
|
33 |
}; |
|
34 |
|
|
35 |
now = function() { |
|
36 |
var _ref; |
|
37 |
return (_ref = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref : +(new Date); |
|
38 |
}; |
|
39 |
|
|
40 |
requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; |
|
41 |
|
|
42 |
cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame; |
|
43 |
|
|
44 |
if (requestAnimationFrame == null) { |
|
45 |
requestAnimationFrame = function(fn) { |
|
46 |
return setTimeout(fn, 50); |
|
47 |
}; |
|
48 |
cancelAnimationFrame = function(id) { |
|
49 |
return clearTimeout(id); |
|
50 |
}; |
|
51 |
} |
|
52 |
|
|
53 |
runAnimation = function(fn) { |
|
54 |
var last, tick; |
|
55 |
last = now(); |
|
56 |
tick = function() { |
|
57 |
var diff; |
|
58 |
diff = now() - last; |
|
59 |
if (diff >= 33) { |
|
60 |
last = now(); |
|
61 |
return fn(diff, function() { |
|
62 |
return requestAnimationFrame(tick); |
|
63 |
}); |
|
64 |
} else { |
|
65 |
return setTimeout(tick, 33 - diff); |
|
66 |
} |
|
67 |
}; |
|
68 |
return tick(); |
|
69 |
}; |
|
70 |
|
|
71 |
result = function() { |
|
72 |
var args, key, obj; |
|
73 |
obj = arguments[0], key = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; |
|
74 |
if (typeof obj[key] === 'function') { |
|
75 |
return obj[key].apply(obj, args); |
|
76 |
} else { |
|
77 |
return obj[key]; |
|
78 |
} |
|
79 |
}; |
|
80 |
|
|
81 |
extend = function() { |
|
82 |
var key, out, source, sources, val, _i, _len; |
|
83 |
out = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; |
|
84 |
for (_i = 0, _len = sources.length; _i < _len; _i++) { |
|
85 |
source = sources[_i]; |
|
86 |
if (source) { |
|
87 |
for (key in source) { |
|
88 |
if (!__hasProp.call(source, key)) continue; |
|
89 |
val = source[key]; |
|
90 |
if ((out[key] != null) && typeof out[key] === 'object' && (val != null) && typeof val === 'object') { |
|
91 |
extend(out[key], val); |
|
92 |
} else { |
|
93 |
out[key] = val; |
|
94 |
} |
|
95 |
} |
|
96 |
} |
|
97 |
} |
|
98 |
return out; |
|
99 |
}; |
|
100 |
|
|
101 |
avgAmplitude = function(arr) { |
|
102 |
var count, sum, v, _i, _len; |
|
103 |
sum = count = 0; |
|
104 |
for (_i = 0, _len = arr.length; _i < _len; _i++) { |
|
105 |
v = arr[_i]; |
|
106 |
sum += Math.abs(v); |
|
107 |
count++; |
|
108 |
} |
|
109 |
return sum / count; |
|
110 |
}; |
|
111 |
|
|
112 |
getFromDOM = function(key, json) { |
|
113 |
var data, e, el; |
|
114 |
if (key == null) { |
|
115 |
key = 'options'; |
|
116 |
} |
|
117 |
if (json == null) { |
|
118 |
json = true; |
|
119 |
} |
|
120 |
el = document.querySelector("[data-pace-" + key + "]"); |
|
121 |
if (!el) { |
|
122 |
return; |
|
123 |
} |
|
124 |
data = el.getAttribute("data-pace-" + key); |
|
125 |
if (!json) { |
|
126 |
return data; |
|
127 |
} |
|
128 |
try { |
|
129 |
return JSON.parse(data); |
|
130 |
} catch (_error) { |
|
131 |
e = _error; |
|
132 |
return typeof console !== "undefined" && console !== null ? console.error("Error parsing inline pace options", e) : void 0; |
|
133 |
} |
|
134 |
}; |
|
135 |
|
|
136 |
Evented = (function() { |
|
137 |
function Evented() {} |
|
138 |
|
|
139 |
Evented.prototype.on = function(event, handler, ctx, once) { |
|
140 |
var _base; |
|
141 |
if (once == null) { |
|
142 |
once = false; |
|
143 |
} |
|
144 |
if (this.bindings == null) { |
|
145 |
this.bindings = {}; |
|
146 |
} |
|
147 |
if ((_base = this.bindings)[event] == null) { |
|
148 |
_base[event] = []; |
|
149 |
} |
|
150 |
return this.bindings[event].push({ |
|
151 |
handler: handler, |
|
152 |
ctx: ctx, |
|
153 |
once: once |
|
154 |
}); |
|
155 |
}; |
|
156 |
|
|
157 |
Evented.prototype.once = function(event, handler, ctx) { |
|
158 |
return this.on(event, handler, ctx, true); |
|
159 |
}; |
|
160 |
|
|
161 |
Evented.prototype.off = function(event, handler) { |
|
162 |
var i, _ref, _results; |
|
163 |
if (((_ref = this.bindings) != null ? _ref[event] : void 0) == null) { |
|
164 |
return; |
|
165 |
} |
|
166 |
if (handler == null) { |
|
167 |
return delete this.bindings[event]; |
|
168 |
} else { |
|
169 |
i = 0; |
|
170 |
_results = []; |
|
171 |
while (i < this.bindings[event].length) { |
|
172 |
if (this.bindings[event][i].handler === handler) { |
|
173 |
_results.push(this.bindings[event].splice(i, 1)); |
|
174 |
} else { |
|
175 |
_results.push(i++); |
|
176 |
} |
|
177 |
} |
|
178 |
return _results; |
|
179 |
} |
|
180 |
}; |
|
181 |
|
|
182 |
Evented.prototype.trigger = function() { |
|
183 |
var args, ctx, event, handler, i, once, _ref, _ref1, _results; |
|
184 |
event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; |
|
185 |
if ((_ref = this.bindings) != null ? _ref[event] : void 0) { |
|
186 |
i = 0; |
|
187 |
_results = []; |
|
188 |
while (i < this.bindings[event].length) { |
|
189 |
_ref1 = this.bindings[event][i], handler = _ref1.handler, ctx = _ref1.ctx, once = _ref1.once; |
|
190 |
handler.apply(ctx != null ? ctx : this, args); |
|
191 |
if (once) { |
|
192 |
_results.push(this.bindings[event].splice(i, 1)); |
|
193 |
} else { |
|
194 |
_results.push(i++); |
|
195 |
} |
|
196 |
} |
|
197 |
return _results; |
|
198 |
} |
|
199 |
}; |
|
200 |
|
|
201 |
return Evented; |
|
202 |
|
|
203 |
})(); |
|
204 |
|
|
205 |
Pace = window.Pace || {}; |
|
206 |
|
|
207 |
window.Pace = Pace; |
|
208 |
|
|
209 |
extend(Pace, Evented.prototype); |
|
210 |
|
|
211 |
options = Pace.options = extend({}, defaultOptions, window.paceOptions, getFromDOM()); |
|
212 |
|
|
213 |
_ref = ['ajax', 'document', 'eventLag', 'elements']; |
|
214 |
for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
|
215 |
source = _ref[_i]; |
|
216 |
if (options[source] === true) { |
|
217 |
options[source] = defaultOptions[source]; |
|
218 |
} |
|
219 |
} |
|
220 |
|
|
221 |
NoTargetError = (function(_super) { |
|
222 |
__extends(NoTargetError, _super); |
|
223 |
|
|
224 |
function NoTargetError() { |
|
225 |
_ref1 = NoTargetError.__super__.constructor.apply(this, arguments); |
|
226 |
return _ref1; |
|
227 |
} |
|
228 |
|
|
229 |
return NoTargetError; |
|
230 |
|
|
231 |
})(Error); |
|
232 |
|
|
233 |
Bar = (function() { |
|
234 |
function Bar() { |
|
235 |
this.progress = 0; |
|
236 |
} |
|
237 |
|
|
238 |
Bar.prototype.getElement = function() { |
|
239 |
var targetElement; |
|
240 |
if (this.el == null) { |
|
241 |
targetElement = document.querySelector(options.target); |
|
242 |
if (!targetElement) { |
|
243 |
throw new NoTargetError; |
|
244 |
} |
|
245 |
this.el = document.createElement('div'); |
|
246 |
this.el.className = "pace pace-active"; |
|
247 |
document.body.className = document.body.className.replace(/pace-done/g, ''); |
|
248 |
document.body.className += ' pace-running'; |
|
249 |
this.el.innerHTML = '<div class="pace-progress">\n <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>'; |
|
250 |
if (targetElement.firstChild != null) { |
|
251 |
targetElement.insertBefore(this.el, targetElement.firstChild); |
|
252 |
} else { |
|
253 |
targetElement.appendChild(this.el); |
|
254 |
} |
|
255 |
} |
|
256 |
return this.el; |
|
257 |
}; |
|
258 |
|
|
259 |
Bar.prototype.finish = function() { |
|
260 |
var el; |
|
261 |
el = this.getElement(); |
|
262 |
el.className = el.className.replace('pace-active', ''); |
|
263 |
el.className += ' pace-inactive'; |
|
264 |
document.body.className = document.body.className.replace('pace-running', ''); |
|
265 |
return document.body.className += ' pace-done'; |
|
266 |
}; |
|
267 |
|
|
268 |
Bar.prototype.update = function(prog) { |
|
269 |
this.progress = prog; |
|
270 |
return this.render(); |
|
271 |
}; |
|
272 |
|
|
273 |
Bar.prototype.destroy = function() { |
|
274 |
try { |
|
275 |
this.getElement().parentNode.removeChild(this.getElement()); |
|
276 |
} catch (_error) { |
|
277 |
NoTargetError = _error; |
|
278 |
} |
|
279 |
return this.el = void 0; |
|
280 |
}; |
|
281 |
|
|
282 |
Bar.prototype.render = function() { |
|
283 |
var el, key, progressStr, transform, _j, _len1, _ref2; |
|
284 |
if (document.querySelector(options.target) == null) { |
|
285 |
return false; |
|
286 |
} |
|
287 |
el = this.getElement(); |
|
288 |
transform = "translate3d(" + this.progress + "%, 0, 0)"; |
|
289 |
_ref2 = ['webkitTransform', 'msTransform', 'transform']; |
|
290 |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { |
|
291 |
key = _ref2[_j]; |
|
292 |
el.children[0].style[key] = transform; |
|
293 |
} |
|
294 |
if (!this.lastRenderedProgress || this.lastRenderedProgress | 0 !== this.progress | 0) { |
|
295 |
el.children[0].setAttribute('data-progress-text', "" + (this.progress | 0) + "%"); |
|
296 |
if (this.progress >= 100) { |
|
297 |
progressStr = '99'; |
|
298 |
} else { |
|
299 |
progressStr = this.progress < 10 ? "0" : ""; |
|
300 |
progressStr += this.progress | 0; |
|
301 |
} |
|
302 |
el.children[0].setAttribute('data-progress', "" + progressStr); |
|
303 |
} |
|
304 |
return this.lastRenderedProgress = this.progress; |
|
305 |
}; |
|
306 |
|
|
307 |
Bar.prototype.done = function() { |
|
308 |
return this.progress >= 100; |
|
309 |
}; |
|
310 |
|
|
311 |
return Bar; |
|
312 |
|
|
313 |
})(); |
|
314 |
|
|
315 |
Events = (function() { |
|
316 |
function Events() { |
|
317 |
this.bindings = {}; |
|
318 |
} |
|
319 |
|
|
320 |
Events.prototype.trigger = function(name, val) { |
|
321 |
var binding, _j, _len1, _ref2, _results; |
|
322 |
if (this.bindings[name] != null) { |
|
323 |
_ref2 = this.bindings[name]; |
|
324 |
_results = []; |
|
325 |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { |
|
326 |
binding = _ref2[_j]; |
|
327 |
_results.push(binding.call(this, val)); |
|
328 |
} |
|
329 |
return _results; |
|
330 |
} |
|
331 |
}; |
|
332 |
|
|
333 |
Events.prototype.on = function(name, fn) { |
|
334 |
var _base; |
|
335 |
if ((_base = this.bindings)[name] == null) { |
|
336 |
_base[name] = []; |
|
337 |
} |
|
338 |
return this.bindings[name].push(fn); |
|
339 |
}; |
|
340 |
|
|
341 |
return Events; |
|
342 |
|
|
343 |
})(); |
|
344 |
|
|
345 |
_XMLHttpRequest = window.XMLHttpRequest; |
|
346 |
|
|
347 |
_XDomainRequest = window.XDomainRequest; |
|
348 |
|
|
349 |
_WebSocket = window.WebSocket; |
|
350 |
|
|
351 |
extendNative = function(to, from) { |
|
352 |
var e, key, _results; |
|
353 |
_results = []; |
|
354 |
for (key in from.prototype) { |
|
355 |
try { |
|
356 |
if ((to[key] == null) && typeof from[key] !== 'function') { |
|
357 |
if (typeof Object.defineProperty === 'function') { |
|
358 |
_results.push(Object.defineProperty(to, key, { |
|
359 |
get: function() { |
|
360 |
return from.prototype[key]; |
|
361 |
}, |
|
362 |
configurable: true, |
|
363 |
enumerable: true |
|
364 |
})); |
|
365 |
} else { |
|
366 |
_results.push(to[key] = from.prototype[key]); |
|
367 |
} |
|
368 |
} else { |
|
369 |
_results.push(void 0); |
|
370 |
} |
|
371 |
} catch (_error) { |
|
372 |
e = _error; |
|
373 |
} |
|
374 |
} |
|
375 |
return _results; |
|
376 |
}; |
|
377 |
|
|
378 |
ignoreStack = []; |
|
379 |
|
|
380 |
Pace.ignore = function() { |
|
381 |
var args, fn, ret; |
|
382 |
fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; |
|
383 |
ignoreStack.unshift('ignore'); |
|
384 |
ret = fn.apply(null, args); |
|
385 |
ignoreStack.shift(); |
|
386 |
return ret; |
|
387 |
}; |
|
388 |
|
|
389 |
Pace.track = function() { |
|
390 |
var args, fn, ret; |
|
391 |
fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; |
|
392 |
ignoreStack.unshift('track'); |
|
393 |
ret = fn.apply(null, args); |
|
394 |
ignoreStack.shift(); |
|
395 |
return ret; |
|
396 |
}; |
|
397 |
|
|
398 |
shouldTrack = function(method) { |
|
399 |
var _ref2; |
|
400 |
if (method == null) { |
|
401 |
method = 'GET'; |
|
402 |
} |
|
403 |
if (ignoreStack[0] === 'track') { |
|
404 |
return 'force'; |
|
405 |
} |
|
406 |
if (!ignoreStack.length && options.ajax) { |
|
407 |
if (method === 'socket' && options.ajax.trackWebSockets) { |
|
408 |
return true; |
|
409 |
} else if (_ref2 = method.toUpperCase(), __indexOf.call(options.ajax.trackMethods, _ref2) >= 0) { |
|
410 |
return true; |
|
411 |
} |
|
412 |
} |
|
413 |
return false; |
|
414 |
}; |
|
415 |
|
|
416 |
RequestIntercept = (function(_super) { |
|
417 |
__extends(RequestIntercept, _super); |
|
418 |
|
|
419 |
function RequestIntercept() { |
|
420 |
var monitorXHR, |
|
421 |
_this = this; |
|
422 |
RequestIntercept.__super__.constructor.apply(this, arguments); |
|
423 |
monitorXHR = function(req) { |
|
424 |
var _open; |
|
425 |
_open = req.open; |
|
426 |
return req.open = function(type, url, async) { |
|
427 |
if (shouldTrack(type)) { |
|
428 |
_this.trigger('request', { |
|
429 |
type: type, |
|
430 |
url: url, |
|
431 |
request: req |
|
432 |
}); |
|
433 |
} |
|
434 |
return _open.apply(req, arguments); |
|
435 |
}; |
|
436 |
}; |
|
437 |
window.XMLHttpRequest = function(flags) { |
|
438 |
var req; |
|
439 |
req = new _XMLHttpRequest(flags); |
|
440 |
monitorXHR(req); |
|
441 |
return req; |
|
442 |
}; |
|
443 |
try { |
|
444 |
extendNative(window.XMLHttpRequest, _XMLHttpRequest); |
|
445 |
} catch (_error) {} |
|
446 |
if (_XDomainRequest != null) { |
|
447 |
window.XDomainRequest = function() { |
|
448 |
var req; |
|
449 |
req = new _XDomainRequest; |
|
450 |
monitorXHR(req); |
|
451 |
return req; |
|
452 |
}; |
|
453 |
try { |
|
454 |
extendNative(window.XDomainRequest, _XDomainRequest); |
|
455 |
} catch (_error) {} |
|
456 |
} |
|
457 |
if ((_WebSocket != null) && options.ajax.trackWebSockets) { |
|
458 |
window.WebSocket = function(url, protocols) { |
|
459 |
var req; |
|
460 |
if (protocols != null) { |
|
461 |
req = new _WebSocket(url, protocols); |
|
462 |
} else { |
|
463 |
req = new _WebSocket(url); |
|
464 |
} |
|
465 |
if (shouldTrack('socket')) { |
|
466 |
_this.trigger('request', { |
|
467 |
type: 'socket', |
|
468 |
url: url, |
|
469 |
protocols: protocols, |
|
470 |
request: req |
|
471 |
}); |
|
472 |
} |
|
473 |
return req; |
|
474 |
}; |
|
475 |
try { |
|
476 |
extendNative(window.WebSocket, _WebSocket); |
|
477 |
} catch (_error) {} |
|
478 |
} |
|
479 |
} |
|
480 |
|
|
481 |
return RequestIntercept; |
|
482 |
|
|
483 |
})(Events); |
|
484 |
|
|
485 |
_intercept = null; |
|
486 |
|
|
487 |
getIntercept = function() { |
|
488 |
if (_intercept == null) { |
|
489 |
_intercept = new RequestIntercept; |
|
490 |
} |
|
491 |
return _intercept; |
|
492 |
}; |
|
493 |
|
|
494 |
shouldIgnoreURL = function(url) { |
|
495 |
var pattern, _j, _len1, _ref2; |
|
496 |
_ref2 = options.ajax.ignoreURLs; |
|
497 |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { |
|
498 |
pattern = _ref2[_j]; |
|
499 |
if (typeof pattern === 'string') { |
|
500 |
if (url.indexOf(pattern) !== -1) { |
|
501 |
return true; |
|
502 |
} |
|
503 |
} else { |
|
504 |
if (pattern.test(url)) { |
|
505 |
return true; |
|
506 |
} |
|
507 |
} |
|
508 |
} |
|
509 |
return false; |
|
510 |
}; |
|
511 |
|
|
512 |
getIntercept().on('request', function(_arg) { |
|
513 |
var after, args, request, type, url; |
|
514 |
type = _arg.type, request = _arg.request, url = _arg.url; |
|
515 |
if (shouldIgnoreURL(url)) { |
|
516 |
return; |
|
517 |
} |
|
518 |
if (!Pace.running && (options.restartOnRequestAfter !== false || shouldTrack(type) === 'force')) { |
|
519 |
args = arguments; |
|
520 |
after = options.restartOnRequestAfter || 0; |
|
521 |
if (typeof after === 'boolean') { |
|
522 |
after = 0; |
|
523 |
} |
|
524 |
return setTimeout(function() { |
|
525 |
var stillActive, _j, _len1, _ref2, _ref3, _results; |
|
526 |
if (type === 'socket') { |
|
527 |
stillActive = request.readyState < 2; |
|
528 |
} else { |
|
529 |
stillActive = (0 < (_ref2 = request.readyState) && _ref2 < 4); |
|
530 |
} |
|
531 |
if (stillActive) { |
|
532 |
Pace.restart(); |
|
533 |
_ref3 = Pace.sources; |
|
534 |
_results = []; |
|
535 |
for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { |
|
536 |
source = _ref3[_j]; |
|
537 |
if (source instanceof AjaxMonitor) { |
|
538 |
source.watch.apply(source, args); |
|
539 |
break; |
|
540 |
} else { |
|
541 |
_results.push(void 0); |
|
542 |
} |
|
543 |
} |
|
544 |
return _results; |
|
545 |
} |
|
546 |
}, after); |
|
547 |
} |
|
548 |
}); |
|
549 |
|
|
550 |
AjaxMonitor = (function() { |
|
551 |
function AjaxMonitor() { |
|
552 |
var _this = this; |
|
553 |
this.elements = []; |
|
554 |
getIntercept().on('request', function() { |
|
555 |
return _this.watch.apply(_this, arguments); |
|
556 |
}); |
|
557 |
} |
|
558 |
|
|
559 |
AjaxMonitor.prototype.watch = function(_arg) { |
|
560 |
var request, tracker, type, url; |
|
561 |
type = _arg.type, request = _arg.request, url = _arg.url; |
|
562 |
if (shouldIgnoreURL(url)) { |
|
563 |
return; |
|
564 |
} |
|
565 |
if (type === 'socket') { |
|
566 |
tracker = new SocketRequestTracker(request); |
|
567 |
} else { |
|
568 |
tracker = new XHRRequestTracker(request); |
|
569 |
} |
|
570 |
return this.elements.push(tracker); |
|
571 |
}; |
|
572 |
|
|
573 |
return AjaxMonitor; |
|
574 |
|
|
575 |
})(); |
|
576 |
|
|
577 |
XHRRequestTracker = (function() { |
|
578 |
function XHRRequestTracker(request) { |
|
579 |
var event, size, _j, _len1, _onreadystatechange, _ref2, |
|
580 |
_this = this; |
|
581 |
this.progress = 0; |
|
582 |
if (window.ProgressEvent != null) { |
|
583 |
size = null; |
|
584 |
request.addEventListener('progress', function(evt) { |
|
585 |
if (evt.lengthComputable) { |
|
586 |
return _this.progress = 100 * evt.loaded / evt.total; |
|
587 |
} else { |
|
588 |
return _this.progress = _this.progress + (100 - _this.progress) / 2; |
|
589 |
} |
|
590 |
}, false); |
|
591 |
_ref2 = ['load', 'abort', 'timeout', 'error']; |
|
592 |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { |
|
593 |
event = _ref2[_j]; |
|
594 |
request.addEventListener(event, function() { |
|
595 |
return _this.progress = 100; |
|
596 |
}, false); |
|
597 |
} |
|
598 |
} else { |
|
599 |
_onreadystatechange = request.onreadystatechange; |
|
600 |
request.onreadystatechange = function() { |
|
601 |
var _ref3; |
|
602 |
if ((_ref3 = request.readyState) === 0 || _ref3 === 4) { |
|
603 |
_this.progress = 100; |
|
604 |
} else if (request.readyState === 3) { |
|
605 |
_this.progress = 50; |
|
606 |
} |
|
607 |
return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0; |
|
608 |
}; |
|
609 |
} |
|
610 |
} |
|
611 |
|
|
612 |
return XHRRequestTracker; |
|
613 |
|
|
614 |
})(); |
|
615 |
|
|
616 |
SocketRequestTracker = (function() { |
|
617 |
function SocketRequestTracker(request) { |
|
618 |
var event, _j, _len1, _ref2, |
|
619 |
_this = this; |
|
620 |
this.progress = 0; |
|
621 |
_ref2 = ['error', 'open']; |
|
622 |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { |
|
623 |
event = _ref2[_j]; |
|
624 |
request.addEventListener(event, function() { |
|
625 |
return _this.progress = 100; |
|
626 |
}, false); |
|
627 |
} |
|
628 |
} |
|
629 |
|
|
630 |
return SocketRequestTracker; |
|
631 |
|
|
632 |
})(); |
|
633 |
|
|
634 |
ElementMonitor = (function() { |
|
635 |
function ElementMonitor(options) { |
|
636 |
var selector, _j, _len1, _ref2; |
|
637 |
if (options == null) { |
|
638 |
options = {}; |
|
639 |
} |
|
640 |
this.elements = []; |
|
641 |
if (options.selectors == null) { |
|
642 |
options.selectors = []; |
|
643 |
} |
|
644 |
_ref2 = options.selectors; |
|
645 |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { |
|
646 |
selector = _ref2[_j]; |
|
647 |
this.elements.push(new ElementTracker(selector)); |
|
648 |
} |
|
649 |
} |
|
650 |
|
|
651 |
return ElementMonitor; |
|
652 |
|
|
653 |
})(); |
|
654 |
|
|
655 |
ElementTracker = (function() { |
|
656 |
function ElementTracker(selector) { |
|
657 |
this.selector = selector; |
|
658 |
this.progress = 0; |
|
659 |
this.check(); |
|
660 |
} |
|
661 |
|
|
662 |
ElementTracker.prototype.check = function() { |
|
663 |
var _this = this; |
|
664 |
if (document.querySelector(this.selector)) { |
|
665 |
return this.done(); |
|
666 |
} else { |
|
667 |
return setTimeout((function() { |
|
668 |
return _this.check(); |
|
669 |
}), options.elements.checkInterval); |
|
670 |
} |
|
671 |
}; |
|
672 |
|
|
673 |
ElementTracker.prototype.done = function() { |
|
674 |
return this.progress = 100; |
|
675 |
}; |
|
676 |
|
|
677 |
return ElementTracker; |
|
678 |
|
|
679 |
})(); |
|
680 |
|
|
681 |
DocumentMonitor = (function() { |
|
682 |
DocumentMonitor.prototype.states = { |
|
683 |
loading: 0, |
|
684 |
interactive: 50, |
|
685 |
complete: 100 |
|
686 |
}; |
|
687 |
|
|
688 |
function DocumentMonitor() { |
|
689 |
var _onreadystatechange, _ref2, |
|
690 |
_this = this; |
|
691 |
this.progress = (_ref2 = this.states[document.readyState]) != null ? _ref2 : 100; |
|
692 |
_onreadystatechange = document.onreadystatechange; |
|
693 |
document.onreadystatechange = function() { |
|
694 |
if (_this.states[document.readyState] != null) { |
|
695 |
_this.progress = _this.states[document.readyState]; |
|
696 |
} |
|
697 |
return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0; |
|
698 |
}; |
|
699 |
} |
|
700 |
|
|
701 |
return DocumentMonitor; |
|
702 |
|
|
703 |
})(); |
|
704 |
|
|
705 |
EventLagMonitor = (function() { |
|
706 |
function EventLagMonitor() { |
|
707 |
var avg, interval, last, points, samples, |
|
708 |
_this = this; |
|
709 |
this.progress = 0; |
|
710 |
avg = 0; |
|
711 |
samples = []; |
|
712 |
points = 0; |
|
713 |
last = now(); |
|
714 |
interval = setInterval(function() { |
|
715 |
var diff; |
|
716 |
diff = now() - last - 50; |
|
717 |
last = now(); |
|
718 |
samples.push(diff); |
|
719 |
if (samples.length > options.eventLag.sampleCount) { |
|
720 |
samples.shift(); |
|
721 |
} |
|
722 |
avg = avgAmplitude(samples); |
|
723 |
if (++points >= options.eventLag.minSamples && avg < options.eventLag.lagThreshold) { |
|
724 |
_this.progress = 100; |
|
725 |
return clearInterval(interval); |
|
726 |
} else { |
|
727 |
return _this.progress = 100 * (3 / (avg + 3)); |
|
728 |
} |
|
729 |
}, 50); |
|
730 |
} |
|
731 |
|
|
732 |
return EventLagMonitor; |
|
733 |
|
|
734 |
})(); |
|
735 |
|
|
736 |
Scaler = (function() { |
|
737 |
function Scaler(source) { |
|
738 |
this.source = source; |
|
739 |
this.last = this.sinceLastUpdate = 0; |
|
740 |
this.rate = options.initialRate; |
|
741 |
this.catchup = 0; |
|
742 |
this.progress = this.lastProgress = 0; |
|
743 |
if (this.source != null) { |
|
744 |
this.progress = result(this.source, 'progress'); |
|
745 |
} |
|
746 |
} |
|
747 |
|
|
748 |
Scaler.prototype.tick = function(frameTime, val) { |
|
749 |
var scaling; |
|
750 |
if (val == null) { |
|
751 |
val = result(this.source, 'progress'); |
|
752 |
} |
|
753 |
if (val >= 100) { |
|
754 |
this.done = true; |
|
755 |
} |
|
756 |
if (val === this.last) { |
|
757 |
this.sinceLastUpdate += frameTime; |
|
758 |
} else { |
|
759 |
if (this.sinceLastUpdate) { |
|
760 |
this.rate = (val - this.last) / this.sinceLastUpdate; |
|
761 |
} |
|
762 |
this.catchup = (val - this.progress) / options.catchupTime; |
|
763 |
this.sinceLastUpdate = 0; |
|
764 |
this.last = val; |
|
765 |
} |
|
766 |
if (val > this.progress) { |
|
767 |
this.progress += this.catchup * frameTime; |
|
768 |
} |
|
769 |
scaling = 1 - Math.pow(this.progress / 100, options.easeFactor); |
|
770 |
this.progress += scaling * this.rate * frameTime; |
|
771 |
this.progress = Math.min(this.lastProgress + options.maxProgressPerFrame, this.progress); |
|
772 |
this.progress = Math.max(0, this.progress); |
|
773 |
this.progress = Math.min(100, this.progress); |
|
774 |
this.lastProgress = this.progress; |
|
775 |
return this.progress; |
|
776 |
}; |
|
777 |
|
|
778 |
return Scaler; |
|
779 |
|
|
780 |
})(); |
|
781 |
|
|
782 |
sources = null; |
|
783 |
|
|
784 |
scalers = null; |
|
785 |
|
|
786 |
bar = null; |
|
787 |
|
|
788 |
uniScaler = null; |
|
789 |
|
|
790 |
animation = null; |
|
791 |
|
|
792 |
cancelAnimation = null; |
|
793 |
|
|
794 |
Pace.running = false; |
|
795 |
|
|
796 |
handlePushState = function() { |
|
797 |
if (options.restartOnPushState) { |
|
798 |
return Pace.restart(); |
|
799 |
} |
|
800 |
}; |
|
801 |
|
|
802 |
if (window.history.pushState != null) { |
|
803 |
_pushState = window.history.pushState; |
|
804 |
window.history.pushState = function() { |
|
805 |
handlePushState(); |
|
806 |
return _pushState.apply(window.history, arguments); |
|
807 |
}; |
|
808 |
} |
|
809 |
|
|
810 |
if (window.history.replaceState != null) { |
|
811 |
_replaceState = window.history.replaceState; |
|
812 |
window.history.replaceState = function() { |
|
813 |
handlePushState(); |
|
814 |
return _replaceState.apply(window.history, arguments); |
|
815 |
}; |
|
816 |
} |
|
817 |
|
|
818 |
SOURCE_KEYS = { |
|
819 |
ajax: AjaxMonitor, |
|
820 |
elements: ElementMonitor, |
|
821 |
document: DocumentMonitor, |
|
822 |
eventLag: EventLagMonitor |
|
823 |
}; |
|
824 |
|
|
825 |
(init = function() { |
|
826 |
var type, _j, _k, _len1, _len2, _ref2, _ref3, _ref4; |
|
827 |
Pace.sources = sources = []; |
|
828 |
_ref2 = ['ajax', 'elements', 'document', 'eventLag']; |
|
829 |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { |
|
830 |
type = _ref2[_j]; |
|
831 |
if (options[type] !== false) { |
|
832 |
sources.push(new SOURCE_KEYS[type](options[type])); |
|
833 |
} |
|
834 |
} |
|
835 |
_ref4 = (_ref3 = options.extraSources) != null ? _ref3 : []; |
|
836 |
for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { |
|
837 |
source = _ref4[_k]; |
|
838 |
sources.push(new source(options)); |
|
839 |
} |
|
840 |
Pace.bar = bar = new Bar; |
|
841 |
scalers = []; |
|
842 |
return uniScaler = new Scaler; |
|
843 |
})(); |
|
844 |
|
|
845 |
Pace.stop = function() { |
|
846 |
Pace.trigger('stop'); |
|
847 |
Pace.running = false; |
|
848 |
bar.destroy(); |
|
849 |
cancelAnimation = true; |
|
850 |
if (animation != null) { |
|
851 |
if (typeof cancelAnimationFrame === "function") { |
|
852 |
cancelAnimationFrame(animation); |
|
853 |
} |
|
854 |
animation = null; |
|
855 |
} |
|
856 |
return init(); |
|
857 |
}; |
|
858 |
|
|
859 |
Pace.restart = function() { |
|
860 |
Pace.trigger('restart'); |
|
861 |
Pace.stop(); |
|
862 |
return Pace.start(); |
|
863 |
}; |
|
864 |
|
|
865 |
Pace.go = function() { |
|
866 |
var start; |
|
867 |
Pace.running = true; |
|
868 |
bar.render(); |
|
869 |
start = now(); |
|
870 |
cancelAnimation = false; |
|
871 |
return animation = runAnimation(function(frameTime, enqueueNextFrame) { |
|
872 |
var avg, count, done, element, elements, i, j, remaining, scaler, scalerList, sum, _j, _k, _len1, _len2, _ref2; |
|
873 |
remaining = 100 - bar.progress; |
|
874 |
count = sum = 0; |
|
875 |
done = true; |
|
876 |
for (i = _j = 0, _len1 = sources.length; _j < _len1; i = ++_j) { |
|
877 |
source = sources[i]; |
|
878 |
scalerList = scalers[i] != null ? scalers[i] : scalers[i] = []; |
|
879 |
elements = (_ref2 = source.elements) != null ? _ref2 : [source]; |
|
880 |
for (j = _k = 0, _len2 = elements.length; _k < _len2; j = ++_k) { |
|
881 |
element = elements[j]; |
|
882 |
scaler = scalerList[j] != null ? scalerList[j] : scalerList[j] = new Scaler(element); |
|
883 |
done &= scaler.done; |
|
884 |
if (scaler.done) { |
|
885 |
continue; |
|
886 |
} |
|
887 |
count++; |
|
888 |
sum += scaler.tick(frameTime); |
|
889 |
} |
|
890 |
} |
|
891 |
avg = sum / count; |
|
892 |
bar.update(uniScaler.tick(frameTime, avg)); |
|
893 |
if (bar.done() || done || cancelAnimation) { |
|
894 |
bar.update(100); |
|
895 |
Pace.trigger('done'); |
|
896 |
return setTimeout(function() { |
|
897 |
bar.finish(); |
|
898 |
Pace.running = false; |
|
899 |
return Pace.trigger('hide'); |
|
900 |
}, Math.max(options.ghostTime, Math.max(options.minTime - (now() - start), 0))); |
|
901 |
} else { |
|
902 |
return enqueueNextFrame(); |
|
903 |
} |
|
904 |
}); |
|
905 |
}; |
|
906 |
|
|
907 |
Pace.start = function(_options) { |
|
908 |
extend(options, _options); |
|
909 |
Pace.running = true; |
|
910 |
try { |
|
911 |
bar.render(); |
|
912 |
} catch (_error) { |
|
913 |
NoTargetError = _error; |
|
914 |
} |
|
915 |
if (!document.querySelector('.pace')) { |
|
916 |
return setTimeout(Pace.start, 50); |
|
917 |
} else { |
|
918 |
Pace.trigger('start'); |
|
919 |
return Pace.go(); |
|
920 |
} |
|
921 |
}; |
|
922 |
|
|
923 |
if (typeof define === 'function' && define.amd) { |
|
924 |
define(['pace'], function() { |
|
925 |
return Pace; |
|
926 |
}); |
|
927 |
} else if (typeof exports === 'object') { |
|
928 |
module.exports = Pace; |
|
929 |
} else { |
|
930 |
if (options.startOnPageLoad) { |
|
931 |
Pace.start(); |
|
932 |
} |
|
933 |
} |
|
934 |
|
|
935 |
}).call(this); |