devote помоему чересчур замороченно
попробывал покороче и попроще сделать.
проверено хром, опера, ie.
код
$Load = (function() {
var loadedScripts = {},//только загруженные скрипты
allscript={};//все скрипты
//хелпер для установки обработчиков событий
function event(el,event,fn) {
if (el.readyState=="complete") return fn();
var count= (event=="readystatechange") ? 2:1;
if ( el.addEventListener) el.addEventListener (event, fn ,false)
else el.attachEvent("on"+event, function(){ count--; if (count==0) fn() } );
}
//грузит скрипт и вешает событие load
function loadAsync(src, callback) {
setTimeout(function(){
if (! (src in allscript) ) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = src;
document.documentElement.firstChild.appendChild(script);
allscript[src]=script;
}
event( allscript[src], '\v'!='v'?'load':"readystatechange",function(){
callback(src,script)
})
},1)
}
//возвращаем функцию
return function (scripts, onload) {
var scripts = typeof scripts === "string" ? [scripts] : scripts,
count=scripts.length;
for( var i = 0; i < scripts.length; i++ ) {
if (scripts[i] in loadedScripts ) count--;
else loadAsync( scripts[i], function(src,script){
loadedScripts[src]=script;
count--;
if ( count==0) onload();
});
}
if (count==0) onload();
}
})();
использование
$Load(["test.js","test2.js","test.js","test.js"],function(){
alert("result");
});