loadscript: simplify and improve script loading - jscancer - Javascript crap (relatively small)
 (HTM) git clone git://git.codemadness.org/jscancer
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 8803e0fdca023fa927652585137eb5607355e357
 (DIR) parent 76a6ab53c42092f2e4a7d7229b0268cc8fd33fd4
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sun,  2 Oct 2016 13:19:16 +0200
       
       loadscript: simplify and improve script loading
       
       - change check if loaded: don't keep global table (can be implemented separately).
       - simplify check if all scripts are loaded: scripts_load.
       - add comment for IE workaround logic.
       - simplify example.
       
       Diffstat:
         M loadscript/example.html             |       5 ++---
         M loadscript/loadscript.js            |      29 +++++++++++++----------------
       
       2 files changed, 15 insertions(+), 19 deletions(-)
       ---
 (DIR) diff --git a/loadscript/example.html b/loadscript/example.html
       @@ -8,13 +8,12 @@
        
        <script type="text/javascript">
        var el = document.getElementById("test");
       -el.addEventListener("click", function() {
       +el.onclick = function() {
                scripts_load(["example_load.js"], function() {
                        test_init();
                });
                // this.style.display = "none"; // hide button.
       -        el.removeEventListener("click", this);
       -});
       +};
        </script>
        </body>
        </html>
 (DIR) diff --git a/loadscript/loadscript.js b/loadscript/loadscript.js
       @@ -1,19 +1,17 @@
       -var script_loaded = {};
       -
        function script_load(uri, fn) {
       -        // load script once.
       -        if (script_loaded[uri] !== undefined)
       -                return;
                var script = document.createElement("script");
                script.type = "text/javascript";
                script.src = uri;
                script.async = true;
       +        var loaded = 0;
                var onload = function() {
       -                if (script_loaded[uri] === undefined) {
       -                        script_loaded[uri] = true;
       +                // fire fn() once.
       +                if (!loaded) {
       +                        loaded = 1;
                                fn();
                        }
                };
       +        // for IE <= 8.
                script.onreadystatechange = function() {
                        switch (this.readyState) {
                        case "complete":
       @@ -21,20 +19,19 @@ function script_load(uri, fn) {
                                onload();
                        }
                }
       +        // for the normal world.
                script.onload = function() {
                        onload();
                };
                document.getElementsByTagName("head")[0].appendChild(script);
        }
        
       -// load list of uri's, fire fn() when all are loaded.
       +// load list of uri's (async, order indetermined), fire fn() when all
       +// are loaded.
        function scripts_load(uris, fn) {
       -        var checkfn = function() {
       -                for (var i = 0; i < uris.length; i++)
       -                        if (script_loaded[uris[i]] === undefined)
       -                                return; // not all scripts are loaded.
       -                fn();
       -        };
       -        for (var i = 0; i < uris.length; i++)
       -                script_load(uris[i], checkfn);
       +        for (var i = 0, loaded = 0; i < uris.length; i++)
       +                script_load(uris[i], function() {
       +                        if (++loaded == uris.length)
       +                                fn();
       +                });
        }