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 ?