Skip to content

Instantly share code, notes, and snippets.

@kishalmi
Last active December 23, 2015 15:59
Show Gist options
  • Save kishalmi/6658995 to your computer and use it in GitHub Desktop.
Save kishalmi/6658995 to your computer and use it in GitHub Desktop.
simple require using jquery
/**
* cheap require (using jquery)
* loads a script (or scripts, if given an array) and executes it
* callbacks for progress and success
* won't load a script twice if already loaded (or failed)
* @param files
* @param callbackProgress
* @param callbackSuccess
*/
function require(files, callbackProgress, callbackSuccess) {
// shift back if progress cb skipped
if (!$.isFunction(callbackSuccess)) {
callbackSuccess = callbackProgress;
callbackProgress = null;
}
if (!$.required) // create jquery namespace for required files
$.required = {
_complete: 0,
_pending: 0
};
var loadScript = function (file) {
var req = $.required[file];
if (!req) {
req = $.required[file] = {
status: 'pending',
callbacks: []
};
// load script
$.required._pending++;
$.ajax({
url: file,
dataType: 'script',
xhr: function () {
var xhr = new window.XMLHttpRequest();
xhr.addEventListener("progress", function (event) {
if (event.lengthComputable && event.loaded < event.total && $.isFunction(callbackProgress))
callbackProgress(($.required._complete + event.loaded / event.total) / $.required._pending);
}, false);
return xhr;
},
success: function (data) {
},
complete: function () {
req.status = 'complete';
$.required._complete++;
if ($.isFunction(callbackProgress)) callbackProgress($.required._complete / $.required._pending);
if ($.required._complete < $.required._pending) return;
// call all success callbacks
while (req.callbacks.length) {
var cb = req.callbacks.shift();
if ($.isFunction(cb)) cb();
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.error('ERROR loading "' + file + '": ' + textStatus + ' (' + errorThrown.message + ')');
}
});
}
switch (req.status) {
case 'pending':
// add valid callbacks to queues
if ($.isFunction(callbackSuccess))
req.callbacks.push(callbackSuccess);
break;
case 'complete':
// already done
if ($.isFunction(callbackSuccess)) callbackSuccess();
break;
// already failed -> call error
if ($.isFunction(callbackError)) callbackError(req.error);
break;
}
};
if (!$.isArray(files)) files = [files];
$.each(files, function (key, value) {
loadScript(value);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment