2009-12-08 3 views
8

Ich muss einen Prototyp hinzufügen und dann scriptaculous hinzufügen und einen Rückruf erhalten, wenn beide fertig geladen sind. Ich bin Laden zur Zeit Prototyp wie folgt:document.createElement ('script') ... zwei Skripte mit einem Callback hinzufügen

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); 

ich dies tun könnte, indem die Rückrufe Chaining, aber das scheint wie eine schlechte Praxis (ich will nicht eine dumme Kette von 20 Callback-Methoden, wenn ich mehrere Skripte laden müssen). Ideen?

+0

Warum fügen Sie dieses Skript nicht zu einem HTML-Code hinzu, anstatt es mit JavaScript zu laden? – RaYell

+2

Ich mache ein bisschen Code, der in den HTML-Code anderer Leute eingefügt wird, um meine Sachen einzubetten. Ich möchte nur ein leeres div und einen Verweis auf meine Javascript-Datei eingefügt werden. – user199085

+0

@kdiegert: dieser Verweis auf Ihre js-Datei eingefügt in: Sie meinen über ''? –

Antwort

33

Ich schlage vor, Sie verwenden einige kleine Loader, die Kette und Sachen für Sie tun. Zum Beispiel wie diese:

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(); 
     } 
    })(); 
} 

sollte Dieses Skript helfen, die Script-Tags zu erstellen und auszuführen Ihren Rückruf anrufen, wenn alle Dateien geladen werden. Rufen Sie ist recht einfach:

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'); 
}); 

Hope this

+0

Bingo. Danke vielmals. – user199085

+0

aysnc.parallel oder async.series könnte helfen mit diesem https://github.com/caolan/async –

+0

'arguments.callee' wirft einen Fehler im strikten Modus: Von https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referenz/Strict_mode "' arguments.callee' wird nicht mehr unterstützt. Im normalen Code bezieht sich 'arguments.callee' auf die umschließende Funktion. Dieser Anwendungsfall ist schwach: Nenne einfach die umschließende Funktion! Außerdem, ' arguments.callee' behindert wesentlich Optimierungen wie das Inlining von Funktionen, weil es möglich sein muss, einen Verweis auf die nicht inlined Funktion zu geben, wenn auf arguments.callee zugegriffen wird –

1

Seit scriptaculous Prototyp erfordert helfen wird, um die Zuhörer zu Kette haben wird, mit welchem ​​Verfahren man diese Skripte laden verwenden.

Es gibt verschiedene Skriptladeprogramme, um Skripts parallel zu laden, so schnell wie möglich, z. LABjs, aber keiner wird in diesem Szenario viel helfen.

Wenn Sie 10-20 Skripts laden möchten, würde ich empfehlen, die Skripts zuvor mit einem Tool wie Combiner zu kombinieren.

+0

tatsächlich verwenden, ist dieses Szenario * genau * was LABjs war entworfen, um zu lösen. –

2

Aufgrund eines Fehlers im Internet Explorer funktioniert das rekursive Loader-Programm von nemisj im IE nicht korrekt.


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(); 
     } 
    })(); 
} 

Dieser kleine Hack tut es, und oft ist die Lösung in IE, wenn ein unerklärliches Problem auftritt, was zu oft ist: durch Setzen einer Verzögerung auf den rekursiven Aufruf wie gelöst werden.

Verwandte Themen