คำตอบคือ
คุณสามารถใช้คำมั่นสัญญาgetScript()
และรอจนกว่าสคริปต์ทั้งหมดจะโหลดขึ้นมาเช่น:
$.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
});
ซอ
FIDDLE อีก
ในโค้ดด้านบนการเพิ่ม Deferred และแก้ไขภายใน$()
ก็เหมือนกับการวางฟังก์ชั่นอื่น ๆ ในการเรียก jQuery เช่น$(func)
มันเหมือนกับ
$(function() { func(); });
กล่าวคือรอให้ DOM พร้อมดังนั้นในตัวอย่างด้านบน$.when
จะรอให้สคริปต์ทั้งหมดถูกโหลดและ DOM จะพร้อมเนื่องจากการ$.Deferred
เรียกที่แก้ไขในการเรียกกลับพร้อม DOM
สำหรับการใช้งานทั่วไปฟังก์ชันที่มีประโยชน์
ฟังก์ชันยูทิลิตี้ที่ยอมรับอาร์เรย์ของสคริปต์สามารถสร้างได้ดังนี้:
$.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);
}
ซึ่งสามารถใช้ได้เช่นนี้
var script_arr = [
'myscript1.js',
'myscript2.js',
'myscript3.js'
];
$.getMultiScripts(script_arr, '/mypath/').done(function() {
// all scripts loaded
});
โดยที่พา ธ จะถูกนำหน้าสคริปต์ทั้งหมดและเป็นทางเลือกซึ่งหมายความว่าหากอาร์เรย์มี URL แบบเต็มก็สามารถทำได้เช่นกันและละทิ้งเส้นทางทั้งหมดไว้ด้วยกัน
$.getMultiScripts(script_arr).done(function() { ...
ข้อโต้แย้งข้อผิดพลาด ฯลฯ
นอกจากนี้โปรดทราบว่าการdone
เรียกกลับจะมีอาร์กิวเมนต์จำนวนหนึ่งที่ตรงกับสคริปต์ที่ส่งผ่านโดยแต่ละอาร์กิวเมนต์แสดงอาร์เรย์ที่มีการตอบสนอง
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
[content_of_file_loaded, status, xhr_object]
ซึ่งแต่ละอาร์เรย์จะมีสิ่งที่ชอบ โดยทั่วไปเราไม่จำเป็นต้องเข้าถึงอาร์กิวเมนต์เหล่านั้นเนื่องจากสคริปต์จะถูกโหลดโดยอัตโนมัติอยู่แล้วและส่วนใหญ่แล้วการdone
โทรกลับเป็นสิ่งที่เรารู้ว่ามีการโหลดสคริปต์ทั้งหมดแล้วฉันแค่เพิ่มเพื่อความสมบูรณ์ และสำหรับบางครั้งที่หายากเมื่อต้องเข้าถึงข้อความจริงจากไฟล์ที่โหลดหรือเมื่อต้องการเข้าถึงวัตถุ XHR แต่ละชิ้นหรือสิ่งที่คล้ายกัน
นอกจากนี้หากสคริปต์ใดไม่สามารถโหลดได้ระบบจะเรียกตัวจัดการความล้มเหลวและสคริปต์ที่ตามมาจะไม่ถูกโหลด
$.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 );})
ที่นี่