skylark-utils
Version:
An Elegant HTML5 JavaScript Library.
89 lines (74 loc) • 2.7 kB
JavaScript
define([
"./skylark",
"./langx",
"./noder",
"./finder"
], function(skylark, langx, noder, finder) {
var head = document.getElementsByTagName('head')[0],
scriptsByUrl = {},
scriptElementsById = {},
count = 0;
function scripter() {
return scripter;
}
langx.mixin(scripter, {
loadJavaScript: function(url, loadedCallback, errorCallback) {
var script = scriptsByUrl[url];
if (!script) {
script = scriptsByUrl[url] = {
state: 0, //0:unload,1:loaded,-1:loaderror
loadedCallbacks: [],
errorCallbacks: []
}
}
script.loadedCallbacks.push(loadedCallback);
script.errorCallbacks.push(errorCallback);
if (script.state === 1) {
script.node.onload();
} else if (script.state === -1) {
script.node.onerror();
} else {
var node = script.node = document.createElement("script"),
id = script.id = (count++);
node.type = "text/javascript";
node.async = false;
node.defer = false;
startTime = new Date().getTime();
head.appendChild(node);
node.onload = function() {
script.state = 1;
var callbacks = script.loadedCallbacks,
i = callbacks.length;
while (i--) {
callbacks[i]();
}
script.loadedCallbacks = [];
script.errorCallbacks = [];
},
node.onerror = function() {
script.state = -1;
var callbacks = script.errorCallbacks,
i = callbacks.length;
while (i--) {
callbacks[i]();
}
script.loadedCallbacks = [];
script.errorCallbacks = [];
};
node.src = url;
scriptElementsById[id] = node;
}
return script.id;
},
deleteJavaScript: function(id) {
var node = scriptElementsById[id];
if (node) {
var url = node.src;
noder.remove(node);
delete scriptElementsById[id];
delete scriptsByUrl[url];
}
}
});
return skylark.scripter = scripter;
});