The problem in question is how to find out a dynamically included JavaScript file is actually loaded. The concept of JavaScript includes is here, the IE-only solution is here. The IE solution is to use the onreadystatechange event that is fired when a new script is included. It also works for dynamically loaded CSS files using a new link DOM element. Thanks to the comment from Björn Graf, I tried using onload event to test if the new script is included using Firefox. It worked!
The code
What we have here (demo) is trying to include a .js file and an .css file, creating new script and link DOM elements. Then I\'m attaching event listeners to those new elements - one onload and one onreadystatechange. The script that is included (jsalert.js) has one alert().
var css; function include_css(css_file) { var html_doc = document.getElementsByTagName(\'head\')[0]; css = document.createElement(\'link\'); css.setAttribute(\'rel\', \'stylesheet\'); css.setAttribute(\'type\', \'text/css\'); css.setAttribute(\'href\', css_file); html_doc.appendChild(css); // alert state change css.onreadystatechange = function () { if (css.readyState == \'complete\') { alert(\'CSS onreadystatechange fired\'); } } css.onload = function () { alert(\'CSS onload fired\'); } return false; } var js; function include_js(file) { var html_doc = document.getElementsByTagName(\'head\')[0]; js = document.createElement(\'script\'); js.setAttribute(\'type\', \'text/javascript\'); js.setAttribute(\'src\', file); html_doc.appendChild(js); js.onreadystatechange = function () { if (js.readyState == \'complete\') { alert(\'JS onreadystate fired\'); } } js.onload = function () { alert(\'JS onload fired\'); } return false; }
Results
As you can probably guess, the results are different in IE and FF.
- CSS inclusion - IE fires both events,
onloadfirst, thenonreadystatechange. FF fires nothing. - JS inclusion - IE fires
onreadystatechange. FF firesonload. Both will execute the script before firing the event.
Conclusion
1. So there is, after all, a cross-browser way to tell when a JavaScript is actually included and that is to attach two event listeners - onload and onreadystatechange.
2. In IE you have two ways to tell when a CSS is included.