mirror of
https://github.com/socketio/socket.io.git
synced 2026-04-30 03:00:39 -04:00
108 lines
3.0 KiB
JavaScript
108 lines
3.0 KiB
JavaScript
!function(win, doc, timeout) {
|
|
var head = doc.getElementsByTagName('head')[0],
|
|
list = {}, ids = {}, delay = {},
|
|
scripts = {}, s = 'string', f = false,
|
|
push = 'push', domContentLoaded = 'DOMContentLoaded', readyState = 'readyState',
|
|
addEventListener = 'addEventListener', onreadystatechange = 'onreadystatechange',
|
|
every = function(ar, fn) {
|
|
for (var i = 0, j = ar.length; i < j; ++i) {
|
|
if (!fn(ar[i])) {
|
|
return f;
|
|
}
|
|
}
|
|
return 1;
|
|
};
|
|
function each(ar, fn) {
|
|
every(ar, function(el) {
|
|
return !fn(el);
|
|
});
|
|
}
|
|
|
|
if (!doc[readyState] && doc[addEventListener]) {
|
|
doc[addEventListener](domContentLoaded, function fn() {
|
|
doc.removeEventListener(domContentLoaded, fn, f);
|
|
doc[readyState] = "complete";
|
|
}, f);
|
|
doc[readyState] = "loading";
|
|
}
|
|
|
|
var $script = function(paths, idOrDone, optDone) {
|
|
paths = paths[push] ? paths : [paths];
|
|
var idOrDoneIsDone = idOrDone && idOrDone.call,
|
|
done = idOrDoneIsDone ? idOrDone : optDone,
|
|
id = idOrDoneIsDone ? paths.join('') : idOrDone,
|
|
queue = paths.length;
|
|
function loopFn(item) {
|
|
return item.call ? item() : list[item];
|
|
}
|
|
function callback() {
|
|
if (!--queue) {
|
|
list[id] = 1;
|
|
done && done();
|
|
for (var dset in delay) {
|
|
every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = []);
|
|
}
|
|
}
|
|
}
|
|
timeout(function() {
|
|
each(paths, function(path) {
|
|
if (scripts[path]) {
|
|
id && (ids[id] = 1);
|
|
callback();
|
|
return;
|
|
}
|
|
scripts[path] = 1;
|
|
id && (ids[id] = 1);
|
|
create($script.path ?
|
|
$script.path + path + '.js' :
|
|
path, callback);
|
|
});
|
|
}, 0);
|
|
return $script;
|
|
};
|
|
|
|
function create(path, fn) {
|
|
var el = doc.createElement("script"),
|
|
loaded = f;
|
|
el.onload = el.onerror = el[onreadystatechange] = function () {
|
|
if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) {
|
|
return;
|
|
}
|
|
el.onload = el[onreadystatechange] = null;
|
|
loaded = 1;
|
|
fn();
|
|
};
|
|
el.async = 1;
|
|
el.src = path;
|
|
head.insertBefore(el, head.firstChild);
|
|
}
|
|
|
|
$script.get = create;
|
|
|
|
$script.ready = function(deps, ready, req) {
|
|
deps = deps[push] ? deps : [deps];
|
|
var missing = [];
|
|
!each(deps, function(dep) {
|
|
list[dep] || missing[push](dep);
|
|
}) && every(deps, function(dep) {
|
|
return list[dep];
|
|
}) ? ready() : !function(key) {
|
|
delay[key] = delay[key] || [];
|
|
delay[key][push](ready);
|
|
req && req(missing);
|
|
}(deps.join('|'));
|
|
return $script;
|
|
};
|
|
|
|
var old = win.$script;
|
|
$script.noConflict = function () {
|
|
win.$script = old;
|
|
return this;
|
|
};
|
|
|
|
(typeof module !== 'undefined' && module.exports) ?
|
|
(module.exports = $script) :
|
|
(win['$script'] = $script);
|
|
|
|
}(this, document, setTimeout);
|