Last active
December 20, 2016 19:35
-
-
Save 0xRampey/bf7170619c1605917bc1d79e02c01aab to your computer and use it in GitHub Desktop.
Supercharged pace.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
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, | |
__slice = [].slice, | |
__hasProp = {}.hasOwnProperty, | |
__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; | |
}, | |
__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; | |
}; | |
defaultOptions = { | |
catchupTime: 100, | |
initialRate: .03, | |
minTime: 250, | |
ghostTime: 100, | |
maxProgressPerFrame: 20, | |
easeFactor: 1.25, | |
startOnPageLoad: true, | |
restartOnPushState: true, | |
restartOnRequestAfter: 500, | |
target: 'body', | |
elements: { | |
checkInterval: 100, | |
selectors: ['body'] | |
}, | |
eventLag: { | |
minSamples: 10, | |
sampleCount: 3, | |
lagThreshold: 3 | |
}, | |
ajax: { | |
trackMethods: ['GET'], | |
trackWebSockets: true, | |
ignoreURLs: [] | |
} | |
}; | |
now = function () { | |
var _ref; | |
return (_ref = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref : +(new Date); | |
}; | |
requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; | |
cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame; | |
if (requestAnimationFrame == null) { | |
requestAnimationFrame = function (fn) { | |
return setTimeout(fn, 50); | |
}; | |
cancelAnimationFrame = function (id) { | |
return clearTimeout(id); | |
}; | |
} | |
runAnimation = function (fn) { | |
var last, tick; | |
last = now(); | |
tick = function () { | |
var diff; | |
diff = now() - last; | |
if (diff >= 33) { | |
last = now(); | |
return fn(diff, function () { | |
return requestAnimationFrame(tick); | |
}); | |
} else { | |
return setTimeout(tick, 33 - diff); | |
} | |
}; | |
return tick(); | |
}; | |
result = function () { | |
var args, key, obj; | |
obj = arguments[0], key = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; | |
if (typeof obj[key] === 'function') { | |
return obj[key].apply(obj, args); | |
} else { | |
return obj[key]; | |
} | |
}; | |
extend = function () { | |
var key, out, source, sources, val, _i, _len; | |
out = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; | |
for (_i = 0, _len = sources.length; _i < _len; _i++) { | |
source = sources[_i]; | |
if (source) { | |
for (key in source) { | |
if (!__hasProp.call(source, key)) continue; | |
val = source[key]; | |
if ((out[key] != null) && typeof out[key] === 'object' && (val != null) && typeof val === 'object') { | |
extend(out[key], val); | |
} else { | |
out[key] = val; | |
} | |
} | |
} | |
} | |
return out; | |
}; | |
avgAmplitude = function (arr) { | |
var count, sum, v, _i, _len; | |
sum = count = 0; | |
for (_i = 0, _len = arr.length; _i < _len; _i++) { | |
v = arr[_i]; | |
sum += Math.abs(v); | |
count++; | |
} | |
return sum / count; | |
}; | |
getFromDOM = function (key, json) { | |
var data, e, el; | |
if (key == null) { | |
key = 'options'; | |
} | |
if (json == null) { | |
json = true; | |
} | |
el = document.querySelector("[data-pace-" + key + "]"); | |
if (!el) { | |
return; | |
} | |
data = el.getAttribute("data-pace-" + key); | |
if (!json) { | |
return data; | |
} | |
try { | |
return JSON.parse(data); | |
} catch (_error) { | |
e = _error; | |
return typeof console !== "undefined" && console !== null ? console.error("Error parsing inline pace options", e) : void 0; | |
} | |
}; | |
Evented = (function () { | |
function Evented() {} | |
Evented.prototype.on = function (event, handler, ctx, once) { | |
var _base; | |
if (once == null) { | |
once = false; | |
} | |
if (this.bindings == null) { | |
this.bindings = {}; | |
} | |
if ((_base = this.bindings)[event] == null) { | |
_base[event] = []; | |
} | |
return this.bindings[event].push({ | |
handler: handler, | |
ctx: ctx, | |
once: once | |
}); | |
}; | |
Evented.prototype.once = function (event, handler, ctx) { | |
return this.on(event, handler, ctx, true); | |
}; | |
Evented.prototype.off = function (event, handler) { | |
var i, _ref, _results; | |
if (((_ref = this.bindings) != null ? _ref[event] : void 0) == null) { | |
return; | |
} | |
if (handler == null) { | |
return delete this.bindings[event]; | |
} else { | |
i = 0; | |
_results = []; | |
while (i < this.bindings[event].length) { | |
if (this.bindings[event][i].handler === handler) { | |
_results.push(this.bindings[event].splice(i, 1)); | |
} else { | |
_results.push(i++); | |
} | |
} | |
return _results; | |
} | |
}; | |
Evented.prototype.trigger = function () { | |
var args, ctx, event, handler, i, once, _ref, _ref1, _results; | |
event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; | |
if ((_ref = this.bindings) != null ? _ref[event] : void 0) { | |
i = 0; | |
_results = []; | |
while (i < this.bindings[event].length) { | |
_ref1 = this.bindings[event][i], handler = _ref1.handler, ctx = _ref1.ctx, once = _ref1.once; | |
handler.apply(ctx != null ? ctx : this, args); | |
if (once) { | |
_results.push(this.bindings[event].splice(i, 1)); | |
} else { | |
_results.push(i++); | |
} | |
} | |
return _results; | |
} | |
}; | |
return Evented; | |
})(); | |
Pace = window.Pace || {}; | |
window.Pace = Pace; | |
extend(Pace, Evented.prototype); | |
options = Pace.options = extend({}, defaultOptions, window.paceOptions, getFromDOM()); | |
_ref = ['ajax', 'document', 'eventLag', 'elements']; | |
for (_i = 0, _len = _ref.length; _i < _len; _i++) { | |
source = _ref[_i]; | |
if (options[source] === true) { | |
options[source] = defaultOptions[source]; | |
} | |
} | |
NoTargetError = (function (_super) { | |
__extends(NoTargetError, _super); | |
function NoTargetError() { | |
_ref1 = NoTargetError.__super__.constructor.apply(this, arguments); | |
return _ref1; | |
} | |
return NoTargetError; | |
})(Error); | |
Bar = (function () { | |
function Bar() { | |
this.progress = 0; | |
} | |
Bar.prototype.getElement = function () { | |
var targetElement; | |
if (this.el == null) { | |
targetElement = document.querySelector(options.target); | |
if (!targetElement) { | |
throw new NoTargetError; | |
} | |
this.el = document.createElement('div'); | |
this.el.className = "pace pace-active"; | |
document.body.className = document.body.className.replace(/pace-done/g, ''); | |
document.body.className += ' pace-running'; | |
this.el.innerHTML = '<div class="pace-progress">\n <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>'; | |
if (targetElement.firstChild != null) { | |
targetElement.insertBefore(this.el, targetElement.firstChild); | |
} else { | |
targetElement.appendChild(this.el); | |
} | |
} | |
return this.el; | |
}; | |
Bar.prototype.finish = function () { | |
var el; | |
el = this.getElement(); | |
el.className = el.className.replace('pace-active', ''); | |
el.className += ' pace-inactive'; | |
document.body.className = document.body.className.replace('pace-running', ''); | |
return document.body.className += ' pace-done'; | |
}; | |
Bar.prototype.update = function (prog) { | |
this.progress = prog; | |
return this.render(); | |
}; | |
Bar.prototype.destroy = function () { | |
try { | |
this.getElement().parentNode.removeChild(this.getElement()); | |
} catch (_error) { | |
NoTargetError = _error; | |
} | |
return this.el = void 0; | |
}; | |
Bar.prototype.render = function () { | |
var el, key, progressStr, transform, _j, _len1, _ref2; | |
if (document.querySelector(options.target) == null) { | |
return false; | |
} | |
el = this.getElement(); | |
transform = "translate3d(" + this.progress + "%, 0, 0)"; | |
_ref2 = ['webkitTransform', 'msTransform', 'transform']; | |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { | |
key = _ref2[_j]; | |
el.children[0].style[key] = transform; | |
} | |
if (!this.lastRenderedProgress || this.lastRenderedProgress | 0 !== this.progress | 0) { | |
el.children[0].setAttribute('data-progress-text', "" + (this.progress | 0) + "%"); | |
if (this.progress >= 100) { | |
progressStr = '99'; | |
} else { | |
progressStr = this.progress < 10 ? "0" : ""; | |
progressStr += this.progress | 0; | |
} | |
el.children[0].setAttribute('data-progress', "" + progressStr); | |
} | |
Pace.trigger("change", this.progress); | |
return this.lastRenderedProgress = this.progress; | |
}; | |
Bar.prototype.done = function () { | |
return this.progress >= 100; | |
}; | |
return Bar; | |
})(); | |
Events = (function () { | |
function Events() { | |
this.bindings = {}; | |
} | |
Events.prototype.trigger = function (name, val) { | |
var binding, _j, _len1, _ref2, _results; | |
if (this.bindings[name] != null) { | |
_ref2 = this.bindings[name]; | |
_results = []; | |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { | |
binding = _ref2[_j]; | |
_results.push(binding.call(this, val)); | |
} | |
return _results; | |
} | |
}; | |
Events.prototype.on = function (name, fn) { | |
var _base; | |
if ((_base = this.bindings)[name] == null) { | |
_base[name] = []; | |
} | |
return this.bindings[name].push(fn); | |
}; | |
return Events; | |
})(); | |
_XMLHttpRequest = window.XMLHttpRequest; | |
_XDomainRequest = window.XDomainRequest; | |
_WebSocket = window.WebSocket; | |
extendNative = function (to, from) { | |
var e, key, _results; | |
_results = []; | |
for (key in from.prototype) { | |
try { | |
if ((to[key] == null) && typeof from[key] !== 'function') { | |
if (typeof Object.defineProperty === 'function') { | |
_results.push(Object.defineProperty(to, key, { | |
get: function () { | |
return from.prototype[key]; | |
}, | |
configurable: true, | |
enumerable: true | |
})); | |
} else { | |
_results.push(to[key] = from.prototype[key]); | |
} | |
} else { | |
_results.push(void 0); | |
} | |
} catch (_error) { | |
e = _error; | |
} | |
} | |
return _results; | |
}; | |
ignoreStack = []; | |
Pace.ignore = function () { | |
var args, fn, ret; | |
fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; | |
ignoreStack.unshift('ignore'); | |
ret = fn.apply(null, args); | |
ignoreStack.shift(); | |
return ret; | |
}; | |
Pace.track = function () { | |
var args, fn, ret; | |
fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; | |
ignoreStack.unshift('track'); | |
ret = fn.apply(null, args); | |
ignoreStack.shift(); | |
return ret; | |
}; | |
shouldTrack = function (method) { | |
var _ref2; | |
if (method == null) { | |
method = 'GET'; | |
} | |
if (ignoreStack[0] === 'track') { | |
return 'force'; | |
} | |
if (!ignoreStack.length && options.ajax) { | |
if (method === 'socket' && options.ajax.trackWebSockets) { | |
return true; | |
} else if (_ref2 = method.toUpperCase(), __indexOf.call(options.ajax.trackMethods, _ref2) >= 0) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
RequestIntercept = (function (_super) { | |
__extends(RequestIntercept, _super); | |
function RequestIntercept() { | |
var monitorXHR, | |
_this = this; | |
RequestIntercept.__super__.constructor.apply(this, arguments); | |
monitorXHR = function (req) { | |
var _open; | |
_open = req.open; | |
return req.open = function (type, url, async) { | |
if (shouldTrack(type)) { | |
_this.trigger('request', { | |
type: type, | |
url: url, | |
request: req | |
}); | |
} | |
return _open.apply(req, arguments); | |
}; | |
}; | |
window.XMLHttpRequest = function (flags) { | |
var req; | |
req = new _XMLHttpRequest(flags); | |
monitorXHR(req); | |
return req; | |
}; | |
try { | |
extendNative(window.XMLHttpRequest, _XMLHttpRequest); | |
} catch (_error) {} | |
if (_XDomainRequest != null) { | |
window.XDomainRequest = function () { | |
var req; | |
req = new _XDomainRequest; | |
monitorXHR(req); | |
return req; | |
}; | |
try { | |
extendNative(window.XDomainRequest, _XDomainRequest); | |
} catch (_error) {} | |
} | |
if ((_WebSocket != null) && options.ajax.trackWebSockets) { | |
window.WebSocket = function (url, protocols) { | |
var req; | |
if (protocols != null) { | |
req = new _WebSocket(url, protocols); | |
} else { | |
req = new _WebSocket(url); | |
} | |
if (shouldTrack('socket')) { | |
_this.trigger('request', { | |
type: 'socket', | |
url: url, | |
protocols: protocols, | |
request: req | |
}); | |
} | |
return req; | |
}; | |
try { | |
extendNative(window.WebSocket, _WebSocket); | |
} catch (_error) {} | |
} | |
} | |
return RequestIntercept; | |
})(Events); | |
_intercept = null; | |
getIntercept = function () { | |
if (_intercept == null) { | |
_intercept = new RequestIntercept; | |
} | |
return _intercept; | |
}; | |
shouldIgnoreURL = function (url) { | |
var pattern, _j, _len1, _ref2; | |
_ref2 = options.ajax.ignoreURLs; | |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { | |
pattern = _ref2[_j]; | |
if (typeof pattern === 'string') { | |
if (url.indexOf(pattern) !== -1) { | |
return true; | |
} | |
} else { | |
if (pattern.test(url)) { | |
return true; | |
} | |
} | |
} | |
return false; | |
}; | |
getIntercept().on('request', function (_arg) { | |
var after, args, request, type, url; | |
type = _arg.type, request = _arg.request, url = _arg.url; | |
if (shouldIgnoreURL(url)) { | |
return; | |
} | |
if (!Pace.running && (options.restartOnRequestAfter !== false || shouldTrack(type) === 'force')) { | |
args = arguments; | |
after = options.restartOnRequestAfter || 0; | |
if (typeof after === 'boolean') { | |
after = 0; | |
} | |
return setTimeout(function () { | |
var stillActive, _j, _len1, _ref2, _ref3, _results; | |
if (type === 'socket') { | |
stillActive = request.readyState < 2; | |
} else { | |
stillActive = (0 < (_ref2 = request.readyState) && _ref2 < 4); | |
} | |
if (stillActive) { | |
Pace.restart(); | |
_ref3 = Pace.sources; | |
_results = []; | |
for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { | |
source = _ref3[_j]; | |
if (source instanceof AjaxMonitor) { | |
source.watch.apply(source, args); | |
break; | |
} else { | |
_results.push(void 0); | |
} | |
} | |
return _results; | |
} | |
}, after); | |
} | |
}); | |
AjaxMonitor = (function () { | |
function AjaxMonitor() { | |
var _this = this; | |
this.elements = []; | |
getIntercept().on('request', function () { | |
return _this.watch.apply(_this, arguments); | |
}); | |
} | |
AjaxMonitor.prototype.watch = function (_arg) { | |
var request, tracker, type, url; | |
type = _arg.type, request = _arg.request, url = _arg.url; | |
if (shouldIgnoreURL(url)) { | |
return; | |
} | |
if (type === 'socket') { | |
tracker = new SocketRequestTracker(request); | |
} else { | |
tracker = new XHRRequestTracker(request); | |
} | |
return this.elements.push(tracker); | |
}; | |
return AjaxMonitor; | |
})(); | |
XHRRequestTracker = (function () { | |
function XHRRequestTracker(request) { | |
var event, size, _j, _len1, _onreadystatechange, _ref2, | |
_this = this; | |
this.progress = 0; | |
if (window.ProgressEvent != null) { | |
size = null; | |
request.addEventListener('progress', function (evt) { | |
if (evt.lengthComputable) { | |
return _this.progress = 100 * evt.loaded / evt.total; | |
} else { | |
return _this.progress = _this.progress + (100 - _this.progress) / 2; | |
} | |
}, false); | |
_ref2 = ['load', 'abort', 'timeout', 'error']; | |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { | |
event = _ref2[_j]; | |
request.addEventListener(event, function () { | |
return _this.progress = 100; | |
}, false); | |
} | |
} else { | |
_onreadystatechange = request.onreadystatechange; | |
request.onreadystatechange = function () { | |
var _ref3; | |
if ((_ref3 = request.readyState) === 0 || _ref3 === 4) { | |
_this.progress = 100; | |
} else if (request.readyState === 3) { | |
_this.progress = 50; | |
} | |
return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0; | |
}; | |
} | |
} | |
return XHRRequestTracker; | |
})(); | |
SocketRequestTracker = (function () { | |
function SocketRequestTracker(request) { | |
var event, _j, _len1, _ref2, | |
_this = this; | |
this.progress = 0; | |
_ref2 = ['error', 'open']; | |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { | |
event = _ref2[_j]; | |
request.addEventListener(event, function () { | |
return _this.progress = 100; | |
}, false); | |
} | |
} | |
return SocketRequestTracker; | |
})(); | |
ElementMonitor = (function () { | |
function ElementMonitor(options) { | |
var selector, _j, _len1, _ref2; | |
if (options == null) { | |
options = {}; | |
} | |
this.elements = []; | |
if (options.selectors == null) { | |
options.selectors = []; | |
} | |
_ref2 = options.selectors; | |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { | |
selector = _ref2[_j]; | |
this.elements.push(new ElementTracker(selector)); | |
} | |
} | |
return ElementMonitor; | |
})(); | |
ElementTracker = (function () { | |
function ElementTracker(selector) { | |
this.selector = selector; | |
this.progress = 0; | |
this.check(); | |
} | |
ElementTracker.prototype.check = function () { | |
var _this = this; | |
if (document.querySelector(this.selector)) { | |
return this.done(); | |
} else { | |
return setTimeout((function () { | |
return _this.check(); | |
}), options.elements.checkInterval); | |
} | |
}; | |
ElementTracker.prototype.done = function () { | |
return this.progress = 100; | |
}; | |
return ElementTracker; | |
})(); | |
DocumentMonitor = (function () { | |
DocumentMonitor.prototype.states = { | |
loading: 0, | |
interactive: 50, | |
complete: 100 | |
}; | |
function DocumentMonitor() { | |
var _onreadystatechange, _ref2, | |
_this = this; | |
this.progress = (_ref2 = this.states[document.readyState]) != null ? _ref2 : 100; | |
_onreadystatechange = document.onreadystatechange; | |
document.onreadystatechange = function () { | |
if (_this.states[document.readyState] != null) { | |
_this.progress = _this.states[document.readyState]; | |
} | |
return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0; | |
}; | |
} | |
return DocumentMonitor; | |
})(); | |
EventLagMonitor = (function () { | |
function EventLagMonitor() { | |
var avg, interval, last, points, samples, | |
_this = this; | |
this.progress = 0; | |
avg = 0; | |
samples = []; | |
points = 0; | |
last = now(); | |
interval = setInterval(function () { | |
var diff; | |
diff = now() - last - 50; | |
last = now(); | |
samples.push(diff); | |
if (samples.length > options.eventLag.sampleCount) { | |
samples.shift(); | |
} | |
avg = avgAmplitude(samples); | |
if (++points >= options.eventLag.minSamples && avg < options.eventLag.lagThreshold) { | |
_this.progress = 100; | |
return clearInterval(interval); | |
} else { | |
return _this.progress = 100 * (3 / (avg + 3)); | |
} | |
}, 50); | |
} | |
return EventLagMonitor; | |
})(); | |
Scaler = (function () { | |
function Scaler(source) { | |
this.source = source; | |
this.last = this.sinceLastUpdate = 0; | |
this.rate = options.initialRate; | |
this.catchup = 0; | |
this.progress = this.lastProgress = 0; | |
if (this.source != null) { | |
this.progress = result(this.source, 'progress'); | |
} | |
} | |
Scaler.prototype.tick = function (frameTime, val) { | |
var scaling; | |
if (val == null) { | |
val = result(this.source, 'progress'); | |
} | |
if (val >= 100) { | |
this.done = true; | |
} | |
if (val === this.last) { | |
this.sinceLastUpdate += frameTime; | |
} else { | |
if (this.sinceLastUpdate) { | |
this.rate = (val - this.last) / this.sinceLastUpdate; | |
} | |
this.catchup = (val - this.progress) / options.catchupTime; | |
this.sinceLastUpdate = 0; | |
this.last = val; | |
} | |
if (val > this.progress) { | |
this.progress += this.catchup * frameTime; | |
} | |
scaling = 1 - Math.pow(this.progress / 100, options.easeFactor); | |
this.progress += scaling * this.rate * frameTime; | |
this.progress = Math.min(this.lastProgress + options.maxProgressPerFrame, this.progress); | |
this.progress = Math.max(0, this.progress); | |
this.progress = Math.min(100, this.progress); | |
this.lastProgress = this.progress; | |
return this.progress; | |
}; | |
return Scaler; | |
})(); | |
sources = null; | |
scalers = null; | |
bar = null; | |
uniScaler = null; | |
animation = null; | |
cancelAnimation = null; | |
Pace.running = false; | |
handlePushState = function () { | |
if (options.restartOnPushState) { | |
return Pace.restart(); | |
} | |
}; | |
if (window.history.pushState != null) { | |
_pushState = window.history.pushState; | |
window.history.pushState = function () { | |
handlePushState(); | |
return _pushState.apply(window.history, arguments); | |
}; | |
} | |
if (window.history.replaceState != null) { | |
_replaceState = window.history.replaceState; | |
window.history.replaceState = function () { | |
handlePushState(); | |
return _replaceState.apply(window.history, arguments); | |
}; | |
} | |
SOURCE_KEYS = { | |
ajax: AjaxMonitor, | |
elements: ElementMonitor, | |
document: DocumentMonitor, | |
eventLag: EventLagMonitor | |
}; | |
(init = function () { | |
var type, _j, _k, _len1, _len2, _ref2, _ref3, _ref4; | |
Pace.sources = sources = []; | |
_ref2 = ['ajax', 'elements', 'document', 'eventLag']; | |
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { | |
type = _ref2[_j]; | |
if (options[type] !== false) { | |
sources.push(new SOURCE_KEYS[type](options[type])); | |
} | |
} | |
_ref4 = (_ref3 = options.extraSources) != null ? _ref3 : []; | |
for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { | |
source = _ref4[_k]; | |
sources.push(new source(options)); | |
} | |
Pace.bar = bar = new Bar; | |
scalers = []; | |
return uniScaler = new Scaler; | |
})(); | |
Pace.stop = function () { | |
Pace.trigger('stop'); | |
Pace.running = false; | |
bar.destroy(); | |
cancelAnimation = true; | |
if (animation != null) { | |
if (typeof cancelAnimationFrame === "function") { | |
cancelAnimationFrame(animation); | |
} | |
animation = null; | |
} | |
return init(); | |
}; | |
Pace.restart = function () { | |
Pace.trigger('restart'); | |
Pace.stop(); | |
return Pace.start(); | |
}; | |
Pace.go = function () { | |
var start; | |
Pace.running = true; | |
bar.render(); | |
start = now(); | |
cancelAnimation = false; | |
return animation = runAnimation(function (frameTime, enqueueNextFrame) { | |
var avg, count, done, element, elements, i, j, remaining, scaler, scalerList, sum, _j, _k, _len1, _len2, _ref2; | |
remaining = 100 - bar.progress; | |
count = sum = 0; | |
done = true; | |
for (i = _j = 0, _len1 = sources.length; _j < _len1; i = ++_j) { | |
source = sources[i]; | |
scalerList = scalers[i] != null ? scalers[i] : scalers[i] = []; | |
elements = (_ref2 = source.elements) != null ? _ref2 : [source]; | |
for (j = _k = 0, _len2 = elements.length; _k < _len2; j = ++_k) { | |
element = elements[j]; | |
scaler = scalerList[j] != null ? scalerList[j] : scalerList[j] = new Scaler(element); | |
done &= scaler.done; | |
if (scaler.done) { | |
continue; | |
} | |
count++; | |
sum += scaler.tick(frameTime); | |
} | |
} | |
avg = sum / count; | |
bar.update(uniScaler.tick(frameTime, avg)); | |
if (bar.done() || done || cancelAnimation) { | |
bar.update(100); | |
Pace.trigger('done'); | |
return setTimeout(function () { | |
bar.finish(); | |
Pace.running = false; | |
return Pace.trigger('hide'); | |
}, Math.max(options.ghostTime, Math.max(options.minTime - (now() - start), 0))); | |
} else { | |
return enqueueNextFrame(); | |
} | |
}); | |
}; | |
Pace.start = function (_options) { | |
extend(options, _options); | |
Pace.running = true; | |
try { | |
bar.render(); | |
} catch (_error) { | |
NoTargetError = _error; | |
} | |
if (!document.querySelector('.pace')) { | |
return setTimeout(Pace.start, 50); | |
} else { | |
Pace.trigger('start'); | |
return Pace.go(); | |
} | |
}; | |
if (typeof define === 'function' && define.amd) { | |
define(['pace'], function () { | |
return Pace; | |
}); | |
} else if (typeof exports === 'object') { | |
module.exports = Pace; | |
} else { | |
if (options.startOnPageLoad) { | |
Pace.start(); | |
} | |
} | |
}).call(this); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment