Jawabannya adalah
Anda dapat menggunakan janji dengan getScript()
dan menunggu hingga semua skrip dimuat, seperti:
$.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
});
BIOLA
FIDDLE LAIN
Dalam kode di atas, menambahkan Tangguhan dan menyelesaikannya di dalam $()
adalah seperti menempatkan fungsi lain di dalam panggilan jQuery, seperti $(func)
, itu sama dengan
$(function() { func(); });
yaitu menunggu DOM siap, jadi dalam contoh di atas $.when
menunggu semua skrip untuk dimuat dan untuk DOM siap karena $.Deferred
panggilan yang diselesaikan dalam DOM ready callback.
Untuk penggunaan yang lebih umum, fungsi praktis
Fungsi utilitas yang menerima berbagai skrip dapat dibuat seperti ini:
$.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);
}
yang bisa digunakan seperti ini
var script_arr = [
'myscript1.js',
'myscript2.js',
'myscript3.js'
];
$.getMultiScripts(script_arr, '/mypath/').done(function() {
// all scripts loaded
});
di mana path akan ditambahkan ke semua skrip, dan juga opsional, yang berarti bahwa jika array berisi URL lengkap, salah satunya juga bisa melakukan ini, dan biarkan path bersama-sama
$.getMultiScripts(script_arr).done(function() { ...
Argumen, kesalahan, dll.
Sebagai tambahan, perhatikan bahwa done
panggilan balik akan berisi sejumlah argumen yang cocok dengan skrip yang diteruskan, setiap argumen mewakili array yang berisi respons
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
di mana setiap array akan berisi sesuatu seperti [content_of_file_loaded, status, xhr_object]
. Kita biasanya tidak perlu mengakses argumen itu karena skrip akan dimuat secara otomatis, dan sebagian besar waktu done
panggilan balik adalah kita benar-benar setelah mengetahui bahwa semua skrip telah dimuat, saya hanya menambahkannya untuk kelengkapan , dan untuk kejadian langka ketika teks aktual dari file yang dimuat perlu diakses, atau ketika seseorang membutuhkan akses ke setiap objek XHR atau sesuatu yang serupa.
Juga, jika ada skrip yang gagal dimuat, penangan yang gagal akan dipanggil, dan skrip berikutnya tidak akan dimuat
$.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 );})
sini?$.ajaxSetup({ cache: true });
tetapi itu juga dapat memengaruhi panggilan ajax lain yang tidak ingin Anda cache, ada banyak lagi tentang ini di dokumen untuk getScript , dan bahkan ada sedikit howto tentang cara membuat fungsi getScript cached yang disebut cachedScript.$.when($.getScript(scriptSrc_1), $.getScript(scriptSrc_2), $.getScript(scriptSrc_3), $.getScript(scriptSrc_4), $.Deferred(function(deferred) { $(deferred.resolve); })).done(function() { ... })
Saya menerapkan fungsi sederhana untuk memuat banyak skrip secara paralel:
Fungsi
Pemakaian
sumber
Muat skrip yang diperlukan berikut dalam panggilan balik dari yang sebelumnya seperti:
sumber
Terkadang perlu memuat skrip dalam urutan tertentu. Misalnya jQuery harus dimuat sebelum jQuery UI. Sebagian besar contoh pada halaman ini memuat skrip secara paralel (asinkron) yang berarti urutan eksekusi tidak dijamin. Tanpa memesan, skrip
y
yang bergantung padax
dapat rusak jika keduanya berhasil dimuat tetapi dalam urutan yang salah.Saya mengusulkan pendekatan hybrid yang memungkinkan pemuatan berurutan dari skrip dependen + pemuatan paralel opsional + objek yang ditangguhkan :
Skrip di kedua antrian akan mengunduh secara paralel, namun skrip di setiap antrian akan mengunduh secara berurutan, memastikan eksekusi yang dipesan. Grafik air terjun:
sumber
Gunakan yepnope.js atau Modernizr (yang mencakup yepnope.js sebagai
Modernizr.load
).MEMPERBARUI
Hanya untuk menindaklanjuti, berikut ini setara dengan apa yang Anda miliki saat ini menggunakan yepnope, yang menunjukkan dependensi pada banyak skrip:
sumber
yepnope.injectJs( scriptSource )
di awal file javascript saya seperti memasukkan<script>
tag dalam file html?$.getScript
. Ini masalah besar.Saya mengalami sejumlah masalah dengan pemuatan multi skrip yang memasukkan satu masalah dengan (setidaknya di Chrome) domain hot loading yang sama dari skrip yang tidak benar-benar berjalan setelah berhasil dimuat oleh Ajax di mana Cross Domain berfungsi dengan sangat baik! :(
Jawaban yang dipilih untuk pertanyaan awal tidak berfungsi dengan baik.
Setelah banyak banyak iterasi di sini adalah jawaban terakhir saya untuk getScript (s) dan memuat beberapa skrip asinkron dalam urutan ketat tertentu dengan opsi pemanggilan kembali panggilan per skrip dan pemanggilan kembali secara keseluruhan saat penyelesaian, Diuji dalam jQuery 2.1+ dan versi modern Chrome, Firefox plus the meninggalkan Internet Explorer.
Kasus pengujian saya memuat file untuk render THREE.JS webGL kemudian memulai skrip render ketika THREE global tersedia menggunakan pemeriksaan interval yang diteruskan ke panggilan fungsi anonim ke onComplete.
Fungsi Prototipe (getScripts)
Cara Penggunaan
Fungsi ini seperti untuk yang saya temukan menggunakan Ditangguhkan (Tidak digunakan sekarang?), Kapan, Sukses & Lengkap dalam uji coba saya untuk TIDAK 100% dapat diandalkan!?, Oleh karena itu fungsi ini dan penggunaan statusCode misalnya.
Anda mungkin ingin menambahkan perilaku penanganan kesalahan / gagal jika diinginkan.
sumber
Anda bisa menggunakan
$.when
-method dengan mencoba fungsi berikut:Fungsi ini akan digunakan seperti ini:
Itulah cara menggunakan Janji dan memiliki biaya overhead minimum.
sumber
Jawaban yang bagus, adeneo.
Butuh beberapa saat untuk mencari tahu bagaimana membuat jawaban Anda lebih umum (sehingga saya bisa memuat array skrip yang ditentukan kode). Callback dipanggil ketika semua skrip telah dimuat dan dieksekusi. Ini solusinya:
sumber
Tambahkan skrip dengan async = false
Inilah pendekatan yang berbeda, tetapi super sederhana. Untuk memuat banyak skrip, Anda cukup menambahkannya ke badan.
Info lebih lanjut di sini: https://www.html5rocks.com/en/tutorials/speed/script-loading/
sumber
Apa yang Anda cari adalah loader AMD yang kompatibel (seperti require.js).
http://requirejs.org/
http://requirejs.org/docs/whyamd.html
Ada banyak sumber terbuka yang bagus jika Anda mencarinya. Pada dasarnya ini memungkinkan Anda untuk mendefinisikan modul kode, dan jika tergantung pada modul kode lainnya, ia akan menunggu sampai modul-modul tersebut selesai diunduh sebelum melanjutkan untuk menjalankan. Dengan cara ini Anda dapat memuat 10 modul secara tidak sinkron dan seharusnya tidak ada masalah walaupun satu tergantung pada beberapa modul lainnya untuk dijalankan.
sumber
Fungsi ini akan memastikan bahwa file dimuat setelah file dependensi dimuat sepenuhnya. Anda hanya perlu memberikan file secara berurutan dengan mengingat dependensi pada file lain.
sumber
Ini bekerja untuk saya:
Dan gunakan itu:
sumber
Berikut ini jawaban menggunakan pertanyaan Maciej Sawicki dan menerapkannya
Promise
sebagai panggilan balik:Menggunakan:
Semua file Javascript diunduh secepat mungkin dan dieksekusi dalam urutan yang diberikan. Kemudian
taskNeedingParameters
dipanggil.sumber
Versi singkat dari jawaban komprehensif Andrew Marc Newton di atas. Yang ini tidak memeriksa kode status untuk berhasil, yang harus Anda lakukan untuk menghindari perilaku UI yang tidak ditentukan.
Yang satu ini untuk sistem yang menjengkelkan di mana saya bisa menjamin jQuery tetapi tidak termasuk yang lain, jadi saya ingin teknik yang cukup singkat untuk tidak digali menjadi skrip eksternal jika dipaksa ke dalamnya. (Anda bisa membuatnya lebih pendek dengan melewati indeks 0 ke panggilan "rekursif" pertama tetapi gaya kebiasaan membuat saya menambahkan gula).
Saya juga menetapkan daftar dependensi ke nama modul, jadi blok ini dapat dimasukkan di mana saja Anda memerlukan "module1" dan skrip dan inisialisasi dependen hanya akan disertakan / dijalankan sekali (Anda dapat login
index
ke callback dan melihat satu pun yang dipesan set permintaan runnning AJAX)sumber
Ada plugin di luar sana yang memperluas metode getScript jQuery. Mengizinkan pemuatan asinkron dan sinkron dan menggunakan mekanisme caching jQuery. Pengungkapan penuh, saya menulis ini. Silakan berkontribusi jika Anda menemukan metode yang lebih baik.
https://github.com/hudsonfoo/jquery-getscripts
sumber
Memuat n skrip satu per satu (berguna jika misalnya file ke-2 membutuhkan yang pertama):
sumber
berdasarkan jawaban dari @adeneo di atas: Menggabungkan pemuatan file css dan js
ada saran untuk perbaikan ??
sumber
Anda dapat mencoba ini menggunakan rekursi. Ini akan mengunduhnya dalam sinkronisasi, satu demi satu hingga selesai mengunduh seluruh daftar.
sumber