My first problem was that I needed to load jQuery javascript file, not via inline html with the
<script ... ></script>
tag, but inside from inside another javascript file. There are plenty of websites explaining how to do this with code like:
function loadjsfile(filename){
var fileref;
fileref=document.createElement('script')
fileref.setAttribute("type","text/javascript")
fileref.setAttribute("src", filename)
var html_doc = document.getElementsByTagName('head')[0];
html_doc.appendChild(fileref);
}
loadjsfile('jquery.js');
loadjsfile('file1.js');
loadjsfile('file2.js');
The problem here is that these files will not load synchronously. I.e. I need file 1 to load after jQuery and file 2 to load after file 1 but using the above method, the files will load asynchronously... which will cause everything to fail. Then I stumbled on this blog post:
http://www.phpied.com/javascript-include-ready-onload/
Which showed me the trick of attaching the onreadystatechange and onload events to the file... nice work guys.
Next, I took their script and modified it a little bit to:
- Use an array and a little bit of recursion to load synchronously instead of simply popping up alerts
- Load both css and js files in one method
- Added fileref.readyState == 'loaded' to the ie code for IE7
// create a 2 dimentional array - 3 files
var myArray=new Array(3)
for (i=0; i < myArray.length; i++) {
myArray[i]=new Array(2)
}
myArray[0][0]="somecssfile.css";
myArray[0][1]="css";
myArray[1][0]="jquery.js";
myArray[1][1]="js";
myArray[2][0]="dependsonjquery.js";
myArray[2][1]="js";
var fileref;
var index = 0;
function loadjscssfile( ) {
//if filename is a external JavaScript file
//alert('loading = ' + myArray[index][0])
if (myArray[index][1]=="js"){
fileref=document.createElement('script')
fileref.setAttribute("type","text/javascript")
fileref.setAttribute("src", myArray[index][0])
}
//if filename is an external CSS file
else if (myArray[index][1]=="css"){
fileref=document.createElement("link")
fileref.setAttribute("rel", "stylesheet")
fileref.setAttribute("type", "text/css")
fileref.setAttribute("href", myArray[index][0])
}
if (typeof fileref!="undefined") {
var html_doc = document.getElementsByTagName('head')[0];
html_doc.appendChild(fileref);
}
// IE
fileref.onreadystatechange = function () {
// complete is for ie6, loaded is for ie7
if (fileref.readyState == 'complete' || fileref.readyState == 'loaded') {
var fileName;
fileref.getAttribute('src') == null ? fileName = fileref.getAttribute('href') : fileName = fileref.getAttribute('src') ;
//alert('loaded = ' + fileName)
index++;
if (index < myArray.length) {
loadjscssfile();
}
}
}
// Firefox
fileref.onload = function () {
if (!(/MSIE (\d+\.\d+);/.test(navigator.userAgent))) { //test for MSIE x.x;
index++;
if (index < myArray.length) {
loadjscssfile();
}
}
}
return false;
}
loadjscssfile();
Works like a charm... now you know :-). Any questions, please post'em.
Hey! how do i find it for Safari?
ReplyDeleteonreadystatechange is not recognized by Safari
This is good one. Still valid technique after all these years.
ReplyDeleteGK
Management & Strategy Consultant - Big Data, M2M
http://gk.palem.in/