How can I use javascript to determine if an HTMLScriptElement has already been fully loaded?
How can I determine if a dynamically loaded script has finished loading without using the onload or onreadystate change events?
Code is as follows:
TOOL.loadScript = function (url, callback, reappend, deepSearch) {
var head, curr, child, tempScript, alreadyAppended, queue,
alreadyHandled, script, handler, loadFunc;
head = document.getElementsByTagName("head")[0];
tempScript = document.createElement("script");
tempScript.src = url;
alreadyAppended = false;
queue = [];
if (deepSearch) {
// search entire document
queue.push(document.firstElementChild);
}
else {
// just search the head element
queue.push(head);
}
while (queue.length !== 0) {
curr = queue.shift();
// add child nodes to queue
child = curr.firstElementChild;
if (child !== null && child !== undefined) {
queue.push(child);
child = child.nextElementSibling;
while (child !== null && child !== undefined) {
queue.push(child);
child = child.nextElementSibling;
}
}
if (curr.tagName !== null && curr.tagName !== undefined) {
if (curr.tagName.toLowerCase() === "script" && curr.src === tempScript.src) {
script = curr;
alreadyAppended = true;
break;
}
}
}
if (!alreadyAppended) {
script = document.createElement("script");
script.type = "text/javascript";
script.async = true;
script.src = url;
}
alreadyHandled = false;
handler = function (event) {
console.log("handling event...");
if (!alreadyHandled) {
if ((!event.readyState) || (event && (event.readyState === "loaded" || event.readyState === "complete"))) {
alreadyHandled = true;
callback.apply(script, [url]);
if (loadFunc) {
loadFunc.apply(script, arguments);
}
}
}
};
if (script.onreadystatechange === undefined) {
loadFunc = script.onload;
script.onload = handler;
}
else {
loadFunc = script.onreadystatechange;
script.onreadystatechange = handler;
}
I need help here. I want the callback function to fire even if alreadyAppeneded === true
and the same script was already loaded, but only if that script is completely finished loading.
if (!alreadyAppended || (alreadyAppended && reappend)) {
head.appendChild(script);
}
};
BOTTOM LINE: How do I determine if a script has completed loading? Please ask me questions if needed.
Thank you.
Why not add an id to the script element? Check to see if the id exists before continuing....
function includeJs(jsFilePath) {
if (document.getElementById(jsFilePath+"_script")) {
return;
}
var js = document.createElement("script");
js.type = "text/javascript";
js.id = jsFilePath+"_script";
js.src = jsFilePath;
document.body.appendChild(js);
}