Skip to content

Instantly share code, notes, and snippets.

@IPRIT
Created December 7, 2017 13:11
Show Gist options
  • Select an option

  • Save IPRIT/02022b083d0f50b5cb1a08186ed3554b to your computer and use it in GitHub Desktop.

Select an option

Save IPRIT/02022b083d0f50b5cb1a08186ed3554b to your computer and use it in GitHub Desktop.
var FontsLoader = global.FontsLoader = function (loadAsParallel) {
this._loadAsParallel = loadAsParallel || true;
this._currentProcesses = [];
this._queue = [];
};
FontsLoader.prototype.load = function (fontUrl, mimeType) {
if (this._loadAsParallel || !this._currentProcesses.length) {
return this._loadFont(fontUrl, mimeType);
}
return this._addToQueue(fontUrl, mimeType);
};
FontsLoader.prototype._loadFont = function (fontUrl, mimeType, queueDefer) {
this._currentProcesses.push(fontUrl);
var defer = queueDefer || $.Deferred(),
self = this,
preloadLink = document.createElement("link"),
firstLink = document.getElementsByTagName("link")[0],
insert = function () {
firstLink.parentNode.insertBefore(preloadLink, firstLink);
},
onLoad = function () {
console.log('Font loaded:', fontUrl);
var index = self._currentProcesses.indexOf( fontUrl );
if (index >= 0) {
self._currentProcesses.splice(index, 1);
}
if (self._queue.length) {
self._loadFont.apply(self, this._queue.shift());
}
defer.resolve(fontUrl);
};
preloadLink.href = fontUrl;
preloadLink.rel = "preload";
preloadLink.as = "font";
preloadLink.crossorigin = "anonymous";
insert();
if (mimeType) {
preloadLink.type = mimeType;
}
if (preloadLink.addEventListener) {
preloadLink.addEventListener('load', onLoad);
} else {
preloadLink.onload = onLoad;
}
return defer;
};
FontsLoader.prototype._addToQueue = function (fontUrl, mimeType) {
var defer = $.Deferred();
this._queue.push([ fontUrl, mimeType, defer ]);
return defer;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment