Dynamically load a JavaScript file

后端 未结 28 3009
说谎
说谎 2020-11-22 06:56

How can you reliably and dynamically load a JavaScript file? This will can be used to implement a module or component that when \'initialized\' the component will dynamical

28条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-22 07:25

    You may write dynamic script tags (using Prototype):

    new Element("script", {src: "myBigCodeLibrary.js", type: "text/javascript"});
    

    The problem here is that we do not know when the external script file is fully loaded.

    We often want our dependant code on the very next line and like to write something like:

    if (iNeedSomeMore) {
        Script.load("myBigCodeLibrary.js"); // includes code for myFancyMethod();
        myFancyMethod(); // cool, no need for callbacks!
    }
    

    There is a smart way to inject script dependencies without the need of callbacks. You simply have to pull the script via a synchronous AJAX request and eval the script on global level.

    If you use Prototype the Script.load method looks like this:

    var Script = {
        _loadedScripts: [],
        include: function(script) {
            // include script only once
            if (this._loadedScripts.include(script)) {
                return false;
            }
            // request file synchronous
            var code = new Ajax.Request(script, {
                asynchronous: false,
                method: "GET",
                evalJS: false,
                evalJSON: false
            }).transport.responseText;
            // eval code on global level
            if (Prototype.Browser.IE) {
                window.execScript(code);
            } else if (Prototype.Browser.WebKit) {
                $$("head").first().insert(Object.extend(
                    new Element("script", {
                        type: "text/javascript"
                    }), {
                        text: code
                    }
                ));
            } else {
                window.eval(code);
            }
            // remember included script
            this._loadedScripts.push(script);
        }
    };
    

提交回复
热议问题