melky, Я писал что-то похожее на то, что
tenshi показал
/*! ScriptLoader API. */
// Constructor
function ScriptLoader(){
var interactive = false,
queueStack = [];
this.loadScript = function(src, onload, useQueue, specifyParentNode){
var o = new function(){
if(typeof src !== "string"){
throw new TypeError("ScriptLoader: bad src " + src);
}
this.src = src;
this.callback = onload || function(){};
this.useQueue = !!useQueue;
this.parentNode = Object(specifyParentNode).nodeType === 1 ? specifyParentNode :
( document.body || document.getElementsByTagName("HEAD")[0] );
};
var script = document.createElement("SCRIPT");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", o.src);
if(!o.queue){
script.onload = o.callback;
o.parentNode.appendChild(script);
return this;
}
queueStack.push([script, o.callback, o.parentNode]);
if(!interactive){
interactive = true;
;(function load(){
var place = queueStack.shift();
if(place){
place[0].onload = function(event){
place[1].call(this, event);
load();
};
place[2].appendChild(place[0]);
} else{
interactive = false;
}
}());
}
return this;
}
}
// lazyMod
ScriptLoader.prototype.multiLoad = function(multiSrc, onload, useQueue, specifyParentNode){
if({}.toString.call(multiSrc) !== "[object Array]"){
throw new TypeError("ScriptLoader#multiLoad: bad multiSrc " + multiSrc);
}
for(var i = 0, l = multiSrc.length; i < l; i ++){
this.loadScript(multiSrc[i], i === l - 1 ? onload : null, useQueue, specifyParentNode);
}
return this;
}
ScriptLoader.prototype.load = function(src, onload, useQueue, specifyParentNode){
if(typeof src === "string"){
return this.loadScript(src, onload, useQueue, specifyParentNode);
} else if({}.toString.call(src) === "[object Array]"){
return this.multiLoad(src, onload, useQueue, specifyParentNode);
} else{
throw new TypeError("ScriptLoader#load: unknown src type " + src);
}
}
// using
var sloader = new ScriptLoader();
sloader.load("http://yandex.st/jquery/1.3.2/jquery.min.js", function(){
alert(!!$);
});
Если использовать мультизагрузку, то колбэк вызывается при загрузке последнего скрипта, если useQueue поставить true, то скрипты загружаются по очереди. Колбэк цепляется на onload скрипта, так что если ошибиться в src, то колбэк не вызовется, также если использовать мультизагрузку с useQueue === true, то если один из скриптов не загрузится, то следующие тоже не пойдут. Иногда удобно пользоваться...