123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- loadjs = (function () {
- var devnull = function() {},
- bundleIdCache = {},
- bundleResultCache = {},
- bundleCallbackQueue = {};
- function subscribe(bundleIds, callbackFn) {
-
- bundleIds = bundleIds.push ? bundleIds : [bundleIds];
- var depsNotFound = [],
- i = bundleIds.length,
- numWaiting = i,
- fn,
- bundleId,
- r,
- q;
-
- fn = function (bundleId, pathsNotFound) {
- if (pathsNotFound.length) depsNotFound.push(bundleId);
- numWaiting--;
- if (!numWaiting) callbackFn(depsNotFound);
- };
-
- while (i--) {
- bundleId = bundleIds[i];
-
- r = bundleResultCache[bundleId];
- if (r) {
- fn(bundleId, r);
- continue;
- }
-
- q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
- q.push(fn);
- }
- }
- function publish(bundleId, pathsNotFound) {
-
- if (!bundleId) return;
- var q = bundleCallbackQueue[bundleId];
-
- bundleResultCache[bundleId] = pathsNotFound;
-
- if (!q) return;
-
- while (q.length) {
- q[0](bundleId, pathsNotFound);
- q.splice(0, 1);
- }
- }
- function executeCallbacks(args, depsNotFound) {
-
- if (args.call) args = {success: args};
-
- if (depsNotFound.length) (args.error || devnull)(depsNotFound);
- else (args.success || devnull)(args);
- }
- function loadFile(path, callbackFn, args, numTries) {
- var doc = document,
- async = args.async,
- maxTries = (args.numRetries || 0) + 1,
- beforeCallbackFn = args.before || devnull,
- pathname = path.replace(/[\?|#].*$/, ''),
- pathStripped = path.replace(/^(css|img)!/, ''),
- isLegacyIECss,
- e;
- numTries = numTries || 0;
- if (/(^css!|\.css$)/.test(pathname)) {
-
- e = doc.createElement('link');
- e.rel = 'stylesheet';
- e.href = pathStripped;
-
- isLegacyIECss = 'hideFocus' in e;
-
- if (isLegacyIECss && e.relList) {
- isLegacyIECss = 0;
- e.rel = 'preload';
- e.as = 'style';
- }
- } else if (/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {
-
- e = doc.createElement('img');
- e.src = pathStripped;
- } else {
-
- e = doc.createElement('script');
- e.src = path;
- e.async = async === undefined ? true : async;
- }
- e.onload = e.onerror = e.onbeforeload = function (ev) {
- var result = ev.type[0];
-
-
- if (isLegacyIECss) {
- try {
- if (!e.sheet.cssText.length) result = 'e';
- } catch (x) {
-
-
- if (x.code != 18) result = 'e';
- }
- }
-
- if (result == 'e') {
-
- numTries += 1;
-
- if (numTries < maxTries) {
- return loadFile(path, callbackFn, args, numTries);
- }
- } else if (e.rel == 'preload' && e.as == 'style') {
-
- return e.rel = 'stylesheet';
- }
-
-
- callbackFn(path, result, ev.defaultPrevented);
- };
-
- if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
- }
- function loadFiles(paths, callbackFn, args) {
-
- paths = paths.push ? paths : [paths];
- var numWaiting = paths.length,
- x = numWaiting,
- pathsNotFound = [],
- fn,
- i;
-
- fn = function(path, result, defaultPrevented) {
-
- if (result == 'e') pathsNotFound.push(path);
-
-
- if (result == 'b') {
- if (defaultPrevented) pathsNotFound.push(path);
- else return;
- }
- numWaiting--;
- if (!numWaiting) callbackFn(pathsNotFound);
- };
-
- for (i=0; i < x; i++) loadFile(paths[i], fn, args);
- }
- function loadjs(paths, arg1, arg2) {
- var bundleId,
- args;
-
- if (arg1 && arg1.trim) bundleId = arg1;
-
- args = (bundleId ? arg2 : arg1) || {};
-
- if (bundleId) {
- if (bundleId in bundleIdCache) {
- throw "LoadJS";
- } else {
- bundleIdCache[bundleId] = true;
- }
- }
- function loadFn(resolve, reject) {
- loadFiles(paths, function (pathsNotFound) {
-
- executeCallbacks(args, pathsNotFound);
-
-
- if (resolve) {
- executeCallbacks({success: resolve, error: reject}, pathsNotFound);
- }
-
- publish(bundleId, pathsNotFound);
- }, args);
- }
-
- if (args.returnPromise) return new Promise(loadFn);
- else loadFn();
- }
- loadjs.ready = function ready(deps, args) {
-
- subscribe(deps, function (depsNotFound) {
-
- executeCallbacks(args, depsNotFound);
- });
- return loadjs;
- };
- loadjs.done = function done(bundleId) {
- publish(bundleId, []);
- };
- loadjs.reset = function reset() {
- bundleIdCache = {};
- bundleResultCache = {};
- bundleCallbackQueue = {};
- };
- loadjs.isDefined = function isDefined(bundleId) {
- return bundleId in bundleIdCache;
- };
- return loadjs;
- })();
|