3 回答

TA貢獻1818條經(jīng)驗 獲得超8個贊
答案是
您可以使用promises 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});
在上面的代碼中,添加一個Deferred并將其解析為內(nèi)部$()
就像在jQuery調(diào)用中放置任何其他函數(shù)一樣$(func)
,就像它一樣
$(function() { func(); });
即它等待DOM準備就緒,因此在上面的例子中$.when
等待加載所有腳本并且由于$.Deferred
在DOM就緒回調(diào)中解析的調(diào)用而使DOM準備就緒。
對于更通用的用途,一個方便的功能
可以像這樣創(chuàng)建一個接受任何腳本數(shù)組的實用程序函數(shù):
$.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});
路徑將被添加到所有腳本的位置,并且也是可選的,這意味著如果數(shù)組包含完整的URL,那么也可以執(zhí)行此操作,并將所有路徑全部放在一起
$.getMultiScripts(script_arr).done(function() { ...
爭論,錯誤等
另外,請注意done
回調(diào)將包含許多與傳入腳本匹配的參數(shù),每個參數(shù)表示包含響應(yīng)的數(shù)組
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
每個數(shù)組都包含類似的內(nèi)容[content_of_file_loaded, status, xhr_object]
。我們通常不需要訪問這些參數(shù),因為無論如何都會自動加載腳本,并且大部分時間done
回調(diào)都是我們真正知道所有腳本都已加載的,我只是為了完整而添加它,以及在需要訪問加載文件的實際文本或需要訪問每個XHR對象或類似內(nèi)容的極少數(shù)情況下。
此外,如果任何腳本無法加載,將調(diào)用失敗處理程序,并且不會加載后續(xù)腳本
$.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
});

TA貢獻1783條經(jīng)驗 獲得超4個贊
您可以嘗試使用遞歸。這將一個接一個地同步下載它們,直到它完成下載整個列表。
var queue = ['url/links/go/here'];ProcessScripts(function() { // All done do what ever you want}, 0);function ProcessScripts(cb, index) { getScript(queue[index], function() { index++; if (index === queue.length) { // Reached the end cb(); } else { return ProcessScripts(cb, index); } });}function getScript(script, callback) { $.getScript(script, function() { callback(); });}

TA貢獻1796條經(jīng)驗 獲得超4個贊
以下是使用Maciej Sawicki的答案并實現(xiàn)Promise
回調(diào):
function loadScripts(urls, path) { return new Promise(function(resolve) { urls.forEach(function(src, i) { let script = document.createElement('script'); script.type = 'text/javascript'; script.src = (path || "") + src; script.async = false; // If last script, bind the callback event to resolve if(i == urls.length-1) { // Multiple binding for browser compatibility script.onreadystatechange = resolve; script.onload = resolve; } // Fire the loading document.body.appendChild(script); }); });}
使用:
let JSDependencies = ["jquery.js", "LibraryNeedingJquery.js", "ParametersNeedingLibrary.js"];loadScripts(JSDependencies,'JavaScript/').then(taskNeedingParameters);
所有Javascript文件都會盡快下載并按給定順序執(zhí)行。然后taskNeedingParameters
被叫。
添加回答
舉報