diff --git a/include/util.js b/include/util.js index 2767080c..f3b558e5 100644 --- a/include/util.js +++ b/include/util.js @@ -217,38 +217,30 @@ Util.conf_defaults = function(cfg, api, defaults, arr) { Util.get_include_uri = function() { return (typeof INCLUDE_URI !== "undefined") ? INCLUDE_URI : "include/"; } +Util._loading_scripts = []; Util._pending_scripts = []; -Util.load_script = function(file, onload) { - var head = document.getElementsByTagName('head')[0]; - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = Util.get_include_uri() + file; - // In order script execution for webkit and firefox - // https://developer.mozilla.org/en-US/docs/HTML/Element/script - script.async = false; - if (Util.Engine.trident) { - // In order script execution for IE 9 - // http://ui.cognifide.com/slides/async-js/template/#26 - script.defer = true; - } - //console.log("loading script: " + Util.get_include_uri() + files[f]); - head.appendChild(script); - if (typeof onload !== "undefined") { - script.onload = script.onreadystatechange = onload; - } - return script; -}; Util.load_scripts = function(files) { - var head = document.getElementsByTagName('head')[0], - ps = Util._pending_scripts; + var head = document.getElementsByTagName('head')[0], script, + ls = Util._loading_scripts, ps = Util._pending_scripts; for (var f=0; f 0 && (ls[0].readyState === 'loaded' || + ls[0].readyState === 'complete')) { + // For IE, append the script to trigger execution + var s = ls.shift(); + //console.log("loaded script: " + s.src); + head.appendChild(s); + } + if (!this.readyState || + (Util.Engine.presto && this.readyState === 'loaded') || + this.readyState === 'complete') { if (ps.indexOf(this) >= 0) { - //console.log("loaded script: " + this.src); + this.onload = this.onreadystatechange = null; + //console.log("completed script: " + this.src); ps.splice(ps.indexOf(this), 1); } // Call window.onscriptsload after last script loads @@ -256,7 +248,19 @@ Util.load_scripts = function(files) { window.onscriptsload(); } } - }); + }; + // In-order script execution tricks + if (Util.Engine.trident) { + // For IE wait until readyState is 'loaded' before + // appending it which will trigger execution + // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order + ls.push(script); + } else { + // For webkit and firefox set async=false and append now + // https://developer.mozilla.org/en-US/docs/HTML/Element/script + script.async = false; + head.appendChild(script); + } ps.push(script); } }