Ticket #258 (new enhancement)

Opened 1 year ago

Last modified 3 days ago

simple javascript import

Reported by: vinces1979@gmail.com Assigned to: somebody
Priority: normal Milestone: MochiKit 1.5
Component: component1 Version:
Severity: normal Keywords:
Cc:

Description

I wanted to dynamically import some js files, so i turned your code from Mochikit into a nice little function:

Import = function(uri){

document.write('<script src="' + uri +'" type="text/javascript"></script>\n');

}

now I can use:

if (x==1){

Import('../../myscript.js')

}

works like a charm, thought it make make a simple feature

Thanks Guys

Change History

03/30/08 09:13:12 changed by cederberg@gmail.com

  • milestone set to MochiKit 1.5.

Moving to version 1.5. I think this perhaps is something suitable for MochiKit.Async. Anyways, I use a more complex version that returns a MochiKit.Async.Deferred with callback:

function loadScript(url) {
    var d = new MochiKit.Async.Deferred();
    var head = document.getElementsByTagName("head")[0];
    var script = MochiKit.DOM.createDOM("script", { type: "text/javascript", src: url });
    var callback = function() {
        script.onload = null;
        script.onreadystatechange = null;
        d.callback();
    };
    script.onload = callback;
    script.onreadystatechange = function() {
        if (script.readyState == "loaded" || script.readyState == "complete") {
            callback();
        }
    };
    head.appendChild(script);
    return d;
}

11/17/08 06:44:52 changed by cederberg@gmail.com

Improved version with error handling.

function loadScript(url) {
    var d = new MochiKit.Async.Deferred();
    var head = document.getElementsByTagName("head")[0];
    var script = MochiKit.DOM.createDOM("script", { type: "text/javascript", src: url });
    script.onload = function() {
        script.onload = null;
        script.onerror = null;
        script.onreadystatechange = null;
        d.callback();
    };
    script.onerror = function(msg) {
        script.onload = null;
        script.onerror = null;
        script.onreadystatechange = null;
        msg = "Failed to load script at " + url + ": " + msg;
        d.errback(new URIError(msg, url));
    }
    script.onreadystatechange = function() {
        if (script.readyState == "loaded" || script.readyState == "complete") {
            script.onload();
        } else {
            // IE doesn't bother to report errors...
            MochiKit.Async.callLater(10, script.onerror, "Script loading timed out")
        }
    };
    head.appendChild(script);
    return d;
}