97 lines
2.8 KiB
JavaScript
97 lines
2.8 KiB
JavaScript
//jsloader.js
|
|
|
|
(function() {
|
|
if(typeof XMLHttpRequest!="function") {
|
|
if(typeof loadfail=="function") {
|
|
loadfail("1-jsloader.js: XMLHttpRequest(type of "+(typeof XMLHttpRequest)+") is not a function");
|
|
} else {
|
|
window.alert("1-jsloader.js: XMLHttpRequest(type of "+(typeof XMLHttpRequest)+") is not a function");
|
|
}
|
|
return;
|
|
}
|
|
|
|
var ScriptManager= {};
|
|
ScriptManager.loading_count=0;
|
|
|
|
ScriptManager.loadjs=async function(pth) {
|
|
var resolve;
|
|
var reject;
|
|
var ret=new Promise(function(s, r) {
|
|
resolve=s;
|
|
reject=r;
|
|
});
|
|
var xhr=new XMLHttpRequest();
|
|
|
|
var onreadystatechange=async function() {
|
|
if(xhr.readyState!=XMLHttpRequest.DONE) {
|
|
return;
|
|
}
|
|
removelisteners();
|
|
ScriptManager.loading_count--;
|
|
if(xhr.status!=200) {
|
|
onfail();
|
|
return;
|
|
}
|
|
console.debug("script "+pth+" fetched successfully.");
|
|
try {
|
|
var fn=new Function(xhr.responseText);
|
|
Object.defineProperty(fn, "name", {"value":pth});
|
|
var re=await fn();
|
|
if(typeof re=="function") {
|
|
await re();
|
|
} else {
|
|
await re;
|
|
}
|
|
} catch(e) {
|
|
console.error(e);
|
|
onfail();
|
|
return;
|
|
}
|
|
console.debug("script "+pth+" loaded.");
|
|
resolve();
|
|
return;
|
|
};
|
|
|
|
var onfail=function() {
|
|
removelisteners();
|
|
xhr.abort();
|
|
window.loadfail("script "+pth+" load failed");
|
|
reject("script "+pth+" load failed");
|
|
};
|
|
|
|
var removelisteners=function() {
|
|
xhr.removeEventListener("readystatechange", onreadystatechange);
|
|
xhr.removeEventListener("error", onfail);
|
|
xhr.removeEventListener("abort", onfail);
|
|
};
|
|
|
|
xhr.addEventListener("readystatechange", onreadystatechange);
|
|
xhr.addEventListener("error", onfail);
|
|
xhr.addEventListener("abort", onfail);
|
|
|
|
xhr.open("GET", pth, true);
|
|
xhr.send();
|
|
|
|
ScriptManager.loading_count++;
|
|
return ret;
|
|
};
|
|
|
|
ScriptManager.isDone=function() {
|
|
return ScriptManager.loading_count==0;
|
|
};
|
|
|
|
ScriptManager.waitAll=async function() {
|
|
return new Promise(function(resolve, reject) {
|
|
var i;
|
|
i=setInterval(function() {
|
|
if(ScriptManager.loading_count==0) {
|
|
clearInterval(i);
|
|
resolve();
|
|
}
|
|
}, 100);
|
|
});
|
|
};
|
|
|
|
window.ScriptManager=ScriptManager;
|
|
})();
|