Document.createElement('script')... добавление двух скриптов с одним обратным вызовом

Мне нужно добавить прототип, а затем добавить scriptaculous и получить обратный вызов, когда они оба будут загружены. Я сейчас загружаю прототип, например:

var script = document.createElement("script");
script.src = "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js";
script.onload = script.onreadystatechange = callback;
document.body.appendChild( script );

Я мог бы сделать это, объединив обратные вызовы, но это похоже на плохую практику (я не хочу глупой цепи из 20 методов обратного вызова, когда мне нужно загрузить больше скриптов). Идеи?

Ответ 1

Я предлагаю вам использовать небольшой загрузчик, который будет цеплять и делать что-то для вас. Например, например:

function loadScripts(array,callback){
    var loader = function(src,handler){
        var script = document.createElement("script");
        script.src = src;
        script.onload = script.onreadystatechange = function(){
            script.onreadystatechange = script.onload = null;
            handler();
        }
        var head = document.getElementsByTagName("head")[0];
        (head || document.body).appendChild( script );
    };
    (function run(){
        if(array.length!=0){
            loader(array.shift(), run);
        }else{
            callback && callback();
        }
    })();
}

Этот script должен помочь вам создать теги script и вызвать обратный вызов при загрузке всех файлов. Вызов довольно прост:

loadScripts([
   "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js",
   "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"
],function(){
    alert('All things are loaded');
});

Надеюсь, это поможет

Ответ 2

Из-за ошибки в Internet Explorer рекурсивная программа-загрузчик от nemisj не работает корректно в IE. Можно решить, установив задержку на рекурсивный вызов, например:


function loadScripts(array,callback){  
    var loader = function(src,handler){  
        var script = document.createElement("script");  
        script.src = src;  
        script.onload = script.onreadystatechange = function(){  
          script.onreadystatechange = script.onload = null;  
          if(/MSIE ([6-9]+\.\d+);/.test(navigator.userAgent))window.setTimeout(function(){handler();},8,this);  
          else handler();  
        }  
        var head = document.getElementsByTagName("head")[0];  
        (head || document.body).appendChild( script );  
    };  
    (function(){  
        if(array.length!=0){  
                loader(array.shift(),arguments.callee);  
        }else{  
                callback && callback();  
        }  
    })();  
}  

Этот небольшой взлом делает это и часто является решением в IE, когда возникает необъяснимая проблема, которая слишком часто.

Ответ 3

Поскольку scriptaculous требует прототипа, вам придется подключать слушателей любым способом, который вы используете для загрузки этих скриптов.

Существуют различные загрузчики script, доступные для загрузки сценариев параллельно, как можно быстрее, например. LABjs, но ничто не поможет в этом сценарии.

Если вы загрузите 10-20 скриптов, я бы рекомендовал комбинировать скрипты заранее, используя такой инструмент, как Combiner.