Odpowiedź to
Możesz używać obietnic getScript()
i czekać, aż wszystkie skrypty zostaną załadowane, na przykład:
$.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
});
SKRZYPCE
KOLEJNY Fiddle
W powyższym kodzie dodanie odroczonego i rozwiązanie go w środku $()
jest jak umieszczenie dowolnej innej funkcji wewnątrz wywołania jQuery, na przykład $(func)
to to samo, co
$(function() { func(); });
tj. czeka, aż DOM będzie gotowy, więc w powyższym przykładzie $.when
czeka, aż wszystkie skrypty zostaną załadowane i DOM będzie gotowy z powodu $.Deferred
wywołania, które jest rozwiązywane w wywołaniu zwrotnym gotowym do DOM.
Do bardziej ogólnego zastosowania przydatna funkcja
Funkcję narzędzia, która akceptuje dowolną tablicę skryptów, można utworzyć w następujący sposób:
$.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);
}
które mogą być używane w ten sposób
var script_arr = [
'myscript1.js',
'myscript2.js',
'myscript3.js'
];
$.getMultiScripts(script_arr, '/mypath/').done(function() {
// all scripts loaded
});
gdzie ścieżka zostanie dołączona do wszystkich skryptów i jest również opcjonalna, co oznacza, że jeśli tablica zawiera pełny adres URL, można to również zrobić i pominąć całą ścieżkę
$.getMultiScripts(script_arr).done(function() { ...
Argumenty, błędy itp.
Na marginesie zwróć uwagę, że done
wywołanie zwrotne będzie zawierało szereg argumentów pasujących do przekazanych w skryptach, przy czym każdy argument reprezentuje tablicę zawierającą odpowiedź
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
gdzie każda tablica będzie zawierać coś podobnego [content_of_file_loaded, status, xhr_object]
. Generalnie nie musimy uzyskiwać dostępu do tych argumentów, ponieważ skrypty i tak będą ładowane automatycznie, a przez większość czasu done
wywołanie zwrotne jest wszystkim, czego naprawdę potrzebujemy, aby wiedzieć, że wszystkie skrypty zostały załadowane, po prostu dodam je dla kompletności oraz w rzadkich przypadkach, gdy trzeba uzyskać dostęp do rzeczywistego tekstu z załadowanego pliku lub gdy potrzebny jest dostęp do każdego obiektu XHR lub czegoś podobnego.
Ponadto, jeśli którykolwiek ze skryptów nie zostanie załadowany, zostanie wywołana procedura obsługi błędów, a kolejne skrypty nie zostaną załadowane
$.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 );})
tutaj?$.ajaxSetup({ cache: true });
ale może to również wpłynąć na inne wywołania Ajax, których nie chcesz buforować, jest o wiele więcej na ten temat w dokumentach dla getScript , a nawet trochę poradnika na temat tworzenia buforowanej funkcji getScript o nazwie cachedScript.$.when($.getScript(scriptSrc_1), $.getScript(scriptSrc_2), $.getScript(scriptSrc_3), $.getScript(scriptSrc_4), $.Deferred(function(deferred) { $(deferred.resolve); })).done(function() { ... })
Zaimplementowałem prostą funkcję do ładowania wielu skryptów równolegle:
Funkcjonować
Stosowanie
źródło
Załaduj następujący potrzebny skrypt w wywołaniu zwrotnym poprzedniego, na przykład:
źródło
Czasami konieczne jest ładowanie skryptów w określonej kolejności. Na przykład jQuery musi zostać załadowany przed interfejsem użytkownika jQuery. Większość przykładów na tej stronie ładuje skrypty równolegle (asynchronicznie), co oznacza, że kolejność wykonywania nie jest gwarantowana. Bez zamawiania skrypt
y
zależnyx
może się zepsuć, jeśli oba zostaną pomyślnie załadowane, ale w złej kolejności.Proponuję podejście hybrydowe, które pozwala na sekwencyjne ładowanie zależnych skryptów + opcjonalne ładowanie równoległe + odroczone obiekty :
Skrypty w obu kolejkach będą pobierane równolegle, jednak skrypty w każdej kolejce będą pobierane po kolei, zapewniając uporządkowane wykonanie. Wykres wodospadu:
źródło
Użyj yepnope.js lub Modernizr (co obejmuje yepnope.js jako
Modernizr.load
).AKTUALIZACJA
Aby kontynuować, oto dobry odpowiednik tego, co obecnie używasz przy użyciu yepnope, pokazujący zależności od wielu skryptów:
źródło
yepnope.injectJs( scriptSource )
na początku mojego pliku javascript, tak jak w przypadku<script>
tagów w pliku html?$.getScript
. To wielka sprawa.Napotkałem wiele problemów z ładowaniem wielu skryptów, w tym jeden problem z (przynajmniej w Chrome) ładowaniem na gorąco skryptów tej samej domeny, które faktycznie nie działają po pomyślnym załadowaniu przez Ajax, gdzie Cross Domain działa doskonale! :(
Wybrana odpowiedź na oryginalne pytanie nie działa rzetelnie.
Po wielu wielu iteracjach tutaj jest moja ostateczna odpowiedź na getScript (y) i ładowanie asynchronicznie wielu skryptów w określonej ścisłej kolejności z opcją wywołania zwrotnego dla każdego skryptu i ogólnym wywołaniem zwrotnym po zakończeniu, Testowane w jQuery 2.1+ i nowoczesnych wersjach Chrome, Firefox plus zapomniany Internet Explorer.
Mój przypadek testowy polegał na ładowaniu plików do renderowania THREE.JS webGL, a następnie uruchamianiu skryptu renderującego, gdy dostępne były TRZY globalne, przy użyciu sprawdzania interwału przekazanego do anonimowego wywołania funkcji onComplete.
Funkcja prototypu (getScripts)
Jak używać
Funkcja jest taka, jaka jest w przypadku, gdy używam Deferred (przestarzałe teraz?), When, Success & Complete w moich próbach NIE są w 100% niezawodne!?, Stąd ta funkcja i na przykład użycie kodu statusu.
Jeśli chcesz, możesz dodać zachowanie obsługi błędów / niepowodzeń.
źródło
Możesz skorzystać z
$.when
-method, próbując następującej funkcji:Ta funkcja byłaby używana w następujący sposób:
W ten sposób można korzystać z obietnic i mieć minimum kosztów ogólnych.
źródło
Świetna odpowiedź, Adeneo.
Zajęło mi trochę czasu, zanim wymyśliłem, jak sprawić, by twoja odpowiedź była bardziej ogólna (tak, żebym mógł załadować tablicę skryptów zdefiniowanych w kodzie). Callback jest wywoływany, gdy wszystkie skrypty zostaną załadowane i wykonane. Oto moje rozwiązanie:
źródło
Dołącz skrypty z async = false
Oto inne, ale super proste podejście. Aby załadować wiele skryptów, możesz po prostu dołączyć je do treści.
Więcej informacji tutaj: https://www.html5rocks.com/en/tutorials/speed/script-loading/
źródło
To, czego szukasz, to program ładujący zgodny z AMD (np. Require.js).
http://requirejs.org/
http://requirejs.org/docs/whyamd.html
Jeśli spojrzysz na to, istnieje wiele dobrych programów typu open source. Zasadniczo pozwala to na zdefiniowanie modułu kodu, a jeśli jest on zależny od innych modułów kodu, będzie czekał, aż zakończy się pobieranie tych modułów przed przystąpieniem do uruchomienia. W ten sposób możesz załadować 10 modułów asynchronicznie i nie powinno być żadnych problemów, nawet jeśli jeden zależy od kilku innych do uruchomienia.
źródło
Ta funkcja zapewni załadowanie pliku po całkowitym załadowaniu pliku zależności. Wystarczy podać pliki w sekwencji, pamiętając o zależnościach od innych plików.
źródło
To działa dla mnie:
I użyj go:
źródło
Oto odpowiedź wykorzystująca odpowiedź Macieja Sawickiego i implementująca
Promise
jako callback:Posługiwać się:
Wszystkie pliki Javascript są pobierane tak szybko, jak to możliwe i wykonywane w podanej kolejności. Następnie
taskNeedingParameters
jest nazywany.źródło
Krótsza wersja wyczerpującej odpowiedzi Andrew Marca Newtona powyżej. Ten nie sprawdza kodu statusu pod kątem powodzenia, co należy zrobić, aby uniknąć niezdefiniowanego zachowania interfejsu użytkownika.
Ten był dla irytującego systemu, w którym mogłem zagwarantować jQuery, ale nie zawierał innych, więc chciałem techniki na tyle krótkiej, aby nie została przeniesiona do zewnętrznego skryptu, jeśli zostanie do niego zmuszona. (Możesz to jeszcze skrócić, przekazując indeks 0 do pierwszego wywołania „rekurencyjnego”, ale siła nawyków stylowych sprawiła, że dodałem cukier).
Przypisuję również listę zależności do nazwy modułu, więc ten blok może być dołączony gdziekolwiek potrzebujesz "moduł1" a skrypty i zależna inicjalizacja zostaną dołączone / uruchomione tylko raz (możesz zalogować się
index
do wywołania zwrotnego i zobaczyć jeden zamówiony zestaw uruchomionych żądań AJAX)źródło
Jest tam wtyczka, która rozszerza metodę getScript jQuery. Umożliwia asynchroniczne i synchroniczne ładowanie oraz wykorzystuje mechanizm buforowania jQuery. Pełne ujawnienie, napisałem to. Jeśli znajdziesz lepszą metodę, możesz wnieść swój wkład.
https://github.com/hudsonfoo/jquery-getscripts
źródło
Ładuje n skryptów jeden po drugim (przydatne, jeśli na przykład drugi plik potrzebuje pierwszego):
źródło
na podstawie odpowiedzi z @adeneo powyżej: Łączenie ładowania plików css i js
jakieś sugestie dotyczące ulepszeń?
źródło
Możesz spróbować, używając rekurencji. Spowoduje to ich zsynchronizowanie, jeden po drugim, aż do zakończenia pobierania całej listy.
źródło