Die Antwort ist
Sie können Versprechen mit verwenden getScript()
und warten, bis alle Skripte geladen sind.
$.when(
$.getScript( "/mypath/myscript1.js" ),
$.getScript( "/mypath/myscript2.js" ),
$.getScript( "/mypath/myscript3.js" ),
$.Deferred(function( deferred ){
$( deferred.resolve );
})
).done(function(){
//place your code here, the scripts are all loaded
});
GEIGE
ANOTHER FIDDLE
In dem obigen Code, das Hinzufügen einer aufgeschobenen und Auflösen es im Inneren $()
ist wie jede andere Funktion innerhalb eines jQuery Anruf tätigen, wie $(func)
, es ist das gleiche wie
$(function() { func(); });
Das heißt, es wartet darauf, dass das DOM bereit ist, und $.when
wartet im obigen Beispiel darauf, dass alle Skripte geladen werden und dass das DOM bereit ist, da der $.Deferred
Anruf im DOM-fähigen Rückruf aufgelöst wird.
Für eine allgemeinere Verwendung eine praktische Funktion
Eine Dienstprogrammfunktion, die ein beliebiges Array von Skripten akzeptiert, kann folgendermaßen erstellt werden:
$.getMultiScripts = function(arr, path) {
var _arr = $.map(arr, function(scr) {
return $.getScript( (path||"") + scr );
});
_arr.push($.Deferred(function( deferred ){
$( deferred.resolve );
}));
return $.when.apply($, _arr);
}
was so verwendet werden kann
var script_arr = [
'myscript1.js',
'myscript2.js',
'myscript3.js'
];
$.getMultiScripts(script_arr, '/mypath/').done(function() {
// all scripts loaded
});
Dabei wird der Pfad allen Skripten vorangestellt und ist ebenfalls optional. Wenn das Array die vollständigen URLs enthält, kann dies auch ausgeführt werden, und der Pfad wird insgesamt weggelassen
$.getMultiScripts(script_arr).done(function() { ...
Argumente, Fehler usw.
Beachten Sie außerdem, dass der done
Rückruf eine Reihe von Argumenten enthält, die mit den in Skripten übergebenen Argumenten übereinstimmen, wobei jedes Argument ein Array darstellt, das die Antwort enthält
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
wo jedes Array so etwas enthält [content_of_file_loaded, status, xhr_object]
. Wir müssen im Allgemeinen nicht auf diese Argumente zugreifen, da die Skripte ohnehin automatisch geladen werden. In den meisten done
Fällen ist der Rückruf alles, was wir wirklich brauchen, um zu wissen, dass alle Skripte geladen wurden. Der Vollständigkeit halber füge ich ihn nur hinzu und in den seltenen Fällen, in denen auf den tatsächlichen Text aus der geladenen Datei zugegriffen werden muss oder wenn auf jedes XHR-Objekt oder ähnliches zugegriffen werden muss.
Wenn eines der Skripte nicht geladen werden kann, wird der Fail-Handler aufgerufen und nachfolgende Skripte werden nicht geladen
$.getMultiScripts(script_arr).done(function() {
// all done
}).fail(function(error) {
// one or more scripts failed to load
}).always(function() {
// always called, both on success and error
});
$.Deferred(function( deferred ){$( deferred.resolve );})
hier hinzufügen ?$.ajaxSetup({ cache: true });
aber das könnte auch Auswirkungen auf andere Ajax - Aufrufe , dass Sie nicht möchten , Cache, es gibt viel mehr dazu in der Dokumentation für getScript , und es gibt sogar eine kleine Anleitung zum Erstellen einer zwischengespeicherten getScript-Funktion namens cachedScript.$.when($.getScript(scriptSrc_1), $.getScript(scriptSrc_2), $.getScript(scriptSrc_3), $.getScript(scriptSrc_4), $.Deferred(function(deferred) { $(deferred.resolve); })).done(function() { ... })
Ich habe eine einfache Funktion implementiert, um mehrere Skripte gleichzeitig zu laden:
Funktion
Verwendung
quelle
Laden Sie das folgende benötigte Skript in den Rückruf des vorherigen wie folgt:
quelle
Manchmal ist es notwendig, Skripte in einer bestimmten Reihenfolge zu laden. Beispielsweise muss jQuery vor der jQuery-Benutzeroberfläche geladen werden. Die meisten Beispiele auf dieser Seite laden Skripte parallel (asynchron), was bedeutet, dass die Ausführungsreihenfolge nicht garantiert ist. Ohne Bestellung kann ein Skript
y
, das davon abhängt , beschädigt werden ,x
wenn beide erfolgreich geladen wurden, jedoch in falscher Reihenfolge.Ich schlage einen hybriden Ansatz vor, der das sequentielle Laden abhängiger Skripte + optionales paralleles Laden + verzögerte Objekte ermöglicht :
Die Skripte in beiden Warteschlangen werden parallel heruntergeladen. Die Skripte in jeder Warteschlange werden jedoch nacheinander heruntergeladen, um eine geordnete Ausführung sicherzustellen. Wasserfallkarte:
quelle
Verwenden Sie yepnope.js oder Modernizr (einschließlich yepnope.js als
Modernizr.load
).AKTUALISIEREN
Hier ist ein gutes Äquivalent zu dem, was Sie derzeit mit yepnope verwenden. Es zeigt Abhängigkeiten von mehreren Skripten:
quelle
yepnope.injectJs( scriptSource )
am Anfang meiner Javascript-Datei verwenden, genauso wie<script>
Tags in die HTML-Datei aufnehmen?$.getScript
. Das ist eine große Sache.Ich bin auf eine Reihe von Problemen beim Laden mehrerer Skripte gestoßen, darunter ein Problem mit (zumindest in Chrome) dem Hot-Laden von Skripten in derselben Domain, die nach dem erfolgreichen Laden durch Ajax nicht ausgeführt wurden, da Cross Domain einwandfrei funktioniert! :((
Die ausgewählte Antwort auf die ursprüngliche Frage funktioniert nicht zuverlässig.
Nach vielen, vielen Iterationen ist hier meine endgültige Antwort auf getScript (s) und das asynchrone Laden mehrerer Skripte in einer bestimmten strengen Reihenfolge mit der pro Skript geladenen Rückrufoption und dem allgemeinen Rückruf nach Abschluss. Getestet in jQuery 2.1+ und modernen Versionen von Chrome, Firefox plus verlassener Internet Explorer.
Mein Testfall bestand darin, Dateien für ein THREE.JS-WebGL-Rendering zu laden und dann das Rendering-Skript zu starten, als THREE global mithilfe einer Intervallprüfung verfügbar wurde, die an einen anonymen Funktionsaufruf an onComplete übergeben wurde.
Die Prototyp-Funktion (getScripts)
Wie benutzt man
Die Funktion ist so, wie sie für die Verwendung von Zurückgestellt (Jetzt veraltet?), Wann, Erfolg und Abschluss in meinen Versuchen als NICHT 100% zuverlässig befunden wurde !?, Daher diese Funktion und Verwendung von statusCode zum Beispiel.
Wenn Sie möchten, können Sie das Verhalten bei der Fehler- / Fehlerbehandlung hinzufügen.
quelle
Sie können die
$.when
Methode verwenden, indem Sie die folgende Funktion ausprobieren:Diese Funktion würde folgendermaßen verwendet:
Auf diese Weise können Sie Versprechen verwenden und ein Minimum an Overhead haben.
quelle
Tolle Antwort, Adeneo.
Ich habe eine Weile gebraucht, um herauszufinden, wie ich Ihre Antwort allgemeiner gestalten kann (damit ich eine Reihe von codedefinierten Skripten laden kann). Callback wird aufgerufen, wenn alle Skripte geladen und ausgeführt wurden. Hier ist meine Lösung:
quelle
Fügen Sie Skripte mit async = false hinzu
Hier ist ein anderer, aber super einfacher Ansatz. Um mehrere Skripte zu laden, können Sie sie einfach an body anhängen.
Weitere Informationen hier: https://www.html5rocks.com/en/tutorials/speed/script-loading/
quelle
Was Sie suchen, ist ein AMD-kompatibler Loader (wie require.js).
http://requirejs.org/
http://requirejs.org/docs/whyamd.html
Es gibt viele gute Open Source, wenn Sie es nachschlagen. Grundsätzlich können Sie so ein Codemodul definieren. Wenn es von anderen Codemodulen abhängig ist, wartet es, bis diese Module heruntergeladen wurden, bevor es ausgeführt wird. Auf diese Weise können Sie 10 Module asynchron laden und es sollte keine Probleme geben, auch wenn eines von einigen anderen abhängig ist, um ausgeführt zu werden.
quelle
Diese Funktion stellt sicher, dass eine Datei geladen wird, nachdem die Abhängigkeitsdatei vollständig geladen wurde. Sie müssen die Dateien nur in einer Reihenfolge bereitstellen, wobei die Abhängigkeiten von anderen Dateien zu berücksichtigen sind.
quelle
Das funktioniert bei mir:
Und benutze es:
quelle
Hier ist die Antwort mit Maciej Sawickis und Implementierung
Promise
als Rückruf:Verwenden:
Alle Javascript-Dateien werden so schnell wie möglich heruntergeladen und in der angegebenen Reihenfolge ausgeführt. Dann
taskNeedingParameters
heißt es.quelle
Kürzere Version von Andrew Marc Newtons umfassender Antwort oben. Dieser überprüft den Statuscode nicht auf Erfolg, was Sie tun sollten, um undefiniertes Verhalten der Benutzeroberfläche zu vermeiden.
Dieses war für ein nerviges System gedacht, bei dem ich jQuery garantieren konnte, aber kein anderes enthält. Daher wollte ich eine Technik, die kurz genug ist, um nicht in ein externes Skript umgewandelt zu werden, wenn sie dazu gezwungen wird. (Sie könnten es noch kürzer machen, indem Sie den Index 0 an den ersten "rekursiven" Aufruf übergeben, aber die Kraft der Stilgewohnheiten hat mich dazu gebracht, den Zucker hinzuzufügen).
Ich weise die Abhängigkeitsliste auch einem Modulnamen zu, sodass dieser Block überall dort eingefügt werden kann, wo Sie "module1" benötigen, und die Skripte und die abhängige Initialisierung nur einmal enthalten / ausgeführt werden (Sie können sich
index
beim Rückruf anmelden und eine einzelne Bestellung anzeigen Satz laufender AJAX-Anforderungen)quelle
Es gibt ein Plugin, das die getScript-Methode von jQuery erweitert. Ermöglicht asynchrones und synchrones Laden und verwendet den Caching-Mechanismus von jQuery. Vollständige Offenlegung, ich habe dies geschrieben. Bitte zögern Sie nicht, einen Beitrag zu leisten, wenn Sie eine bessere Methode finden.
https://github.com/hudsonfoo/jquery-getscripts
quelle
Lädt n Skripte nacheinander (nützlich, wenn zum Beispiel die 2. Datei die 1. benötigt):
quelle
basierend auf der Antwort von @adeneo oben: Kombiniert das Laden von CSS- und JS-Dateien
Verbesserungsvorschläge ??
quelle
Sie können dies mit Rekursion versuchen. Dadurch werden sie nacheinander synchron heruntergeladen, bis der Download der gesamten Liste abgeschlossen ist.
quelle