225 lines
5.4 KiB
JavaScript
225 lines
5.4 KiB
JavaScript
/*
|
|
-----------------------------------------------------------
|
|
dom.loadScript.js : 0.1.4 : 2014/02/12 : http://mudcu.be
|
|
-----------------------------------------------------------
|
|
Copyright 2011-2014 Mudcube. All rights reserved.
|
|
-----------------------------------------------------------
|
|
/// No verification
|
|
dom.loadScript.add("../js/jszip/jszip.js");
|
|
/// Strict loading order and verification.
|
|
dom.loadScript.add({
|
|
strictOrder: true,
|
|
urls: [
|
|
{
|
|
url: "../js/jszip/jszip.js",
|
|
verify: "JSZip",
|
|
onsuccess: function() {
|
|
console.log(1)
|
|
}
|
|
},
|
|
{
|
|
url: "../inc/downloadify/js/swfobject.js",
|
|
verify: "swfobject",
|
|
onsuccess: function() {
|
|
console.log(2)
|
|
}
|
|
}
|
|
],
|
|
onsuccess: function() {
|
|
console.log(3)
|
|
}
|
|
});
|
|
/// Just verification.
|
|
dom.loadScript.add({
|
|
url: "../js/jszip/jszip.js",
|
|
verify: "JSZip",
|
|
onsuccess: function() {
|
|
console.log(1)
|
|
}
|
|
});
|
|
*/
|
|
|
|
if (typeof(dom) === "undefined") var dom = {};
|
|
|
|
(function() { "use strict";
|
|
|
|
dom.loadScript = function() {
|
|
this.loaded = {};
|
|
this.loading = {};
|
|
return this;
|
|
};
|
|
|
|
dom.loadScript.prototype.add = function(config) {
|
|
var that = this;
|
|
if (typeof(config) === "string") {
|
|
config = { url: config };
|
|
}
|
|
var urls = config.urls;
|
|
if (typeof(urls) === "undefined") {
|
|
urls = [{
|
|
url: config.url,
|
|
verify: config.verify
|
|
}];
|
|
}
|
|
/// adding the elements to the head
|
|
var doc = document.getElementsByTagName("head")[0];
|
|
///
|
|
var testElement = function(element, test) {
|
|
if (that.loaded[element.url]) return;
|
|
if (test && globalExists(test) === false) return;
|
|
that.loaded[element.url] = true;
|
|
//
|
|
if (that.loading[element.url]) that.loading[element.url]();
|
|
delete that.loading[element.url];
|
|
//
|
|
if (element.onsuccess) element.onsuccess();
|
|
if (typeof(getNext) !== "undefined") getNext();
|
|
};
|
|
///
|
|
var hasError = false;
|
|
var batchTest = [];
|
|
var addElement = function(element) {
|
|
if (typeof(element) === "string") {
|
|
element = {
|
|
url: element,
|
|
verify: config.verify
|
|
};
|
|
}
|
|
if (/([\w\d.\[\]\'\"])$/.test(element.verify)) { // check whether its a variable reference
|
|
var verify = element.test = element.verify;
|
|
if (typeof(verify) === "object") {
|
|
for (var n = 0; n < verify.length; n ++) {
|
|
batchTest.push(verify[n]);
|
|
}
|
|
} else {
|
|
batchTest.push(verify);
|
|
}
|
|
}
|
|
if (that.loaded[element.url]) return;
|
|
var script = document.createElement("script");
|
|
script.onreadystatechange = function() {
|
|
if (this.readyState !== "loaded" && this.readyState !== "complete") return;
|
|
testElement(element);
|
|
};
|
|
script.onload = function() {
|
|
testElement(element);
|
|
};
|
|
script.onerror = function() {
|
|
hasError = true;
|
|
delete that.loading[element.url];
|
|
if (typeof(element.test) === "object") {
|
|
for (var key in element.test) {
|
|
removeTest(element.test[key]);
|
|
}
|
|
} else {
|
|
removeTest(element.test);
|
|
}
|
|
};
|
|
script.setAttribute("type", "text/javascript");
|
|
script.setAttribute("src", element.url);
|
|
doc.appendChild(script);
|
|
that.loading[element.url] = function() {};
|
|
};
|
|
/// checking to see whether everything loaded properly
|
|
var removeTest = function(test) {
|
|
var ret = [];
|
|
for (var n = 0; n < batchTest.length; n ++) {
|
|
if (batchTest[n] === test) continue;
|
|
ret.push(batchTest[n]);
|
|
}
|
|
batchTest = ret;
|
|
};
|
|
var onLoad = function(element) {
|
|
if (element) {
|
|
testElement(element, element.test);
|
|
} else {
|
|
for (var n = 0; n < urls.length; n ++) {
|
|
testElement(urls[n], urls[n].test);
|
|
}
|
|
}
|
|
var istrue = true;
|
|
for (var n = 0; n < batchTest.length; n ++) {
|
|
if (globalExists(batchTest[n]) === false) {
|
|
istrue = false;
|
|
}
|
|
}
|
|
if (!config.strictOrder && istrue) { // finished loading all the requested scripts
|
|
if (hasError) {
|
|
if (config.error) {
|
|
config.error();
|
|
}
|
|
} else if (config.onsuccess) {
|
|
config.onsuccess();
|
|
}
|
|
} else { // keep calling back the function
|
|
setTimeout(function() { //- should get slower over time?
|
|
onLoad(element);
|
|
}, 10);
|
|
}
|
|
};
|
|
/// loading methods; strict ordering or loose ordering
|
|
if (config.strictOrder) {
|
|
var ID = -1;
|
|
var getNext = function() {
|
|
ID ++;
|
|
if (!urls[ID]) { // all elements are loaded
|
|
if (hasError) {
|
|
if (config.error) {
|
|
config.error();
|
|
}
|
|
} else if (config.onsuccess) {
|
|
config.onsuccess();
|
|
}
|
|
} else { // loading new script
|
|
var element = urls[ID];
|
|
var url = element.url;
|
|
if (that.loading[url]) { // already loading from another call (attach to event)
|
|
that.loading[url] = function() {
|
|
if (element.onsuccess) element.onsuccess();
|
|
getNext();
|
|
}
|
|
} else if (!that.loaded[url]) { // create script element
|
|
addElement(element);
|
|
onLoad(element);
|
|
} else { // it's already been successfully loaded
|
|
getNext();
|
|
}
|
|
}
|
|
};
|
|
getNext();
|
|
} else { // loose ordering
|
|
for (var ID = 0; ID < urls.length; ID ++) {
|
|
addElement(urls[ID]);
|
|
onLoad(urls[ID]);
|
|
}
|
|
}
|
|
};
|
|
|
|
dom.loadScript = new dom.loadScript();
|
|
|
|
var globalExists = function(path, root) {
|
|
try {
|
|
path = path.split('"').join('').split("'").join('').split(']').join('').split('[').join('.');
|
|
var parts = path.split(".");
|
|
var length = parts.length;
|
|
var object = root || window;
|
|
for (var n = 0; n < length; n ++) {
|
|
var key = parts[n];
|
|
if (object[key] == null) {
|
|
return false;
|
|
} else { //
|
|
object = object[key];
|
|
}
|
|
}
|
|
return true;
|
|
} catch(e) {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
})();
|
|
|
|
/// For NodeJS
|
|
if (typeof (module) !== "undefined" && module.exports) {
|
|
module.exports = dom.loadScript;
|
|
} |