I load js files dynamically in my project putting their content in a script tag in the head. Each file has only an object inside. I noticed that after loading, all objects are in the script tag but only the first is not undefined (the order I put content doesn't change the problem, first is an object, others nope)
This is the script
window.onload = function () {objMaster.end(objMaster.main());};
objMaster = {
// ---------- MAIN
main: function () {
// Setting up the environment
if (!this.set()) return 101;
// Loading core modules
if (!this.load('FrameBee/Core/1_Engineer.js', 'js')) return 201;
if (!this.load('FrameBee/Core/2_Manager.js', 'tmp_js')) return 202;
if (!this.load('FrameBee/Core/3_Lumberjack.js', 'tmp_js')) return 203;
if (!this.load('FrameBee/Core/4_Recruiter.js', 'tmp_js')) return 204;
if (!this.load('FrameBee/Core/5_Sage.js', 'tmp_js')) return 205;
if (!this.load('FrameBee/Core/6_Architect.js', 'tmp_js')) return 206;
if (!this.load('FrameBee/Core/7_Agent.js', 'tmp_js')) return 207;
// Checking core objects declaration
if (typeof objManager !== 'object') return 301;
if (typeof objLumberjack !== 'object') return 302;
if (typeof objRecruiter !== 'object') return 303;
if (typeof objSage !== 'object') return 304;
if (typeof objArchitect !== 'object') return 305;
if (typeof objAgent !== 'object') return 306;
return 1;
},
// ---------- ENDING MAIN
end: function (valIN) {
var strOUT = null;
// Setting up the error message if main() is not true
switch (valIN) {
// Environment
case 101:
strOUT = this.att.error.environment;
break;
// Loading core modules
case 201:
strOUT = 'Engineer' + this.att.error.unreachable;
break;
case 202:
strOUT = 'Manager' + this.att.error.unreachable;
break;
case 203:
strOUT = 'LumberJack' + this.att.error.unreachable;
break;
case 204:
strOUT = 'Recruiter' + this.att.error.unreachable;
break;
case 205:
strOUT = 'Sage' + this.att.error.unreachable;
break;
case 206:
strOUT = 'Architect' + this.att.error.unreachable;
break;
case 207:
strOUT = 'Agent' + this.att.error.unreachable;
break;
// Checking core objects
case 301:
strOUT = 'Manager' + this.att.error.undeclared;
break;
case 302:
strOUT = 'Lumberjack' + this.att.error.undeclared;
break;
case 303:
strOUT = 'Recruiter' + this.att.error.undeclared;
break;
case 304:
strOUT = 'Sage' + this.att.error.undeclared;
break;
case 305:
strOUT = 'Architect' + this.att.error.undeclared;
break;
case 306:
strOUT = 'Agent' + this.att.error.undeclared;
break;
}
// Showing error message only if main() is not true
if (strOUT !== null) document.body.innerHTML =
this.att.error.open +
strOUT +
this.att.error.close;
return 1;
},
// ---------- ATTRIBUTES
att: {
// Class identifier for removing temporary elements in the end
tmp_class: 'FrameBee_Temp',
// IDs of FrameBee head tag environment
id: {
style: 'FrameBee_Head_Style',
tmp_style: 'FrameBee_Head_Style_Temp',
script: 'FrameBee_Head_Script',
tmp_script: 'FrameBee_Head_Script_Temp',
},
// Error messages
error: {
// Enclousers
open: '<h1>FrameBee ERROR</h1><p>:: ',
close: '</p><hr><i>Application is halted</i>',
// Suffix
environment: 'Environment is not properly setted',
unreachable: ' core module is not reachable',
undeclared: ' object is not declared',
},
},
// ---------- METHODS
// .......... Set the HTML environment
set: function () {
var elmTMP = null;
// Adding style element
elmTMP = document.createElement('style');
elmTMP.setAttribute('id', this.att.id.style);
elmTMP.setAttribute('type', 'text/css');
elmTMP.setAttribute('rel', 'stylesheet');
document.head.appendChild(elmTMP);
// Adding temp style element
elmTMP = document.createElement('style');
elmTMP.setAttribute('id', this.att.id.tmp_style);
elmTMP.setAttribute('class', this.att.tmp_class);
elmTMP.setAttribute('type', 'text/css');
elmTMP.setAttribute('rel', 'stylesheet');
document.head.appendChild(elmTMP);
// Adding script element
elmTMP = document.createElement('script');
elmTMP.setAttribute('id', this.att.id.script);
elmTMP.setAttribute('type', 'text/javascript');
document.head.appendChild(elmTMP);
// Adding temp script element
elmTMP = document.createElement('script');
elmTMP.setAttribute('id', this.att.id.tmp_script);
elmTMP.setAttribute('class', this.att.tmp_class);
elmTMP.setAttribute('type', 'text/javascript');
document.head.appendChild(elmTMP);
// Checking the environment
if (
document.getElementById(this.att.id.style) === null ||
document.getElementById(this.att.id.tmp_style) === null ||
document.getElementById(this.att.id.script) === null ||
document.getElementById(this.att.id.tmp_script) === null
) return 0;
if (
document.getElementById(this.att.id.tmp_style).className.indexOf(this.att.tmp_class) < 0 ||
document.getElementById(this.att.id.tmp_script).className.indexOf(this.att.tmp_class) < 0
) return 0;
return 1;
},
// .......... [-] Get file content if file exists
get: function (pthIN) {
var reqTMP = new XMLHttpRequest();
reqTMP.open('GET', pthIN, false);
reqTMP.send(null);
if (reqTMP.status !== 200) return 0;
return reqTMP.response;
},
// .......... [-] Add content to head tags
add: function (txtIN, catIN) {
var attTMP = null;
switch (catIN) {
case 'css':
attTMP = this.att.id.style;
break;
case 'tmp_css':
attTMP = this.att.id.tmp_style;
break;
case 'js':
attTMP = this.att.id.script;
break;
case 'tmp_js':
attTMP = this.att.id.tmp_script;
break;
}
if (attTMP === null) return 0;
document.getElementById(attTMP).innerHTML += txtIN;
return 1;
},
// .......... [+] Load core module
load: function (pthIN, catIN) {
var valTMP = this.get(pthIN);
if (valTMP === 0) return 0;
if (this.add(valTMP, catIN) === 0) return 0;
return 1;
},
//// .......... Check if object is defined
//check: function (objIN) {
// if (typeof objIN !== 'object') return 0;
// return 1;
//},
};
All js files are same this two (changing the name)
/*
FrameBee Framework version 0.2
THE MANAGER . Resources Manager
*/
objManager = {};
or this one
/*
FrameBee Framework version 0.2
THE LUMBERJACK . Global logger
*/
objLumberjack = {};
here the script tag result
<script class="FrameBee_Temp" id="FrameBee_Head_Script_Temp" type="text/javascript">
/*
FrameBee Framework version 0.2
THE MANAGER . Resources Manager
*/
objManager = {};
/*
FrameBee Framework version 0.2
THE LUMBERJACK . Global logger
*/
objLumberjack = {};
/*
FrameBee Framework version 0.2
THE RECRUITER . Resources Loader
*/
objRecruiter = {};
/*
FrameBee Framework version 0.2
THE SAGE . Classes guard
*/
objSage = {};
/*
FrameBee Framework version 0.2
THE ARCHITECT . Style definition
*/
objArchitect = {};
/*
FrameBee Framework version 0.2
THE AGENT . Style applyer
*/
objAgent = {};
</script>
There is a big difference between loading and executing. The best place to check all objects are ready is on DOMContentLoaded event.