Cách bao gồm nhiều tệp js bằng phương thức jQuery $ .getScript ()


127

Tôi đang cố gắng tự động đưa các tệp javascript vào tệp js của mình. Tôi đã thực hiện một số nghiên cứu về nó và thấy phương thức jQuery $ .getScript () sẽ là một cách mong muốn.

// jQuery
$.getScript('/path/to/imported/script.js', function()
{
    // script is now loaded and executed.
    // put your dependent JS here.
    // what if the JS code is dependent on multiple JS files? 
});

Nhưng tôi tự hỏi liệu phương pháp này có thể tải nhiều tập lệnh cùng một lúc không? Tại sao tôi hỏi điều này là bởi vì đôi khi tệp javascript của tôi phụ thuộc vào nhiều hơn một tệp js.

Cảm ơn bạn trước.

Câu trả lời:


315

Câu trả lời là

Bạn có thể sử dụng lời hứa với getScript()và đợi cho đến khi tất cả các tập lệnh được tải, đại loại như:

$.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
    
});

VĨ CẦM

KHÁC fiddle

Trong đoạn mã trên, việc thêm Trì hoãn và giải quyết nó bên trong $()cũng giống như đặt bất kỳ hàm nào khác trong một lệnh gọi jQuery, giống như $(func), nó giống như

$(function() { func(); });

tức là nó chờ DOM sẵn sàng, vì vậy trong ví dụ trên, $.whenchờ tất cả các tập lệnh được tải DOM sẵn sàng vì $.Deferredcuộc gọi giải quyết trong cuộc gọi lại sẵn sàng của DOM.


Để sử dụng chung hơn, một chức năng tiện dụng

Một hàm tiện ích chấp nhận bất kỳ mảng script nào có thể được tạo như thế này:

$.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);
}

có thể được sử dụng như thế này

var script_arr = [
    'myscript1.js', 
    'myscript2.js', 
    'myscript3.js'
];

$.getMultiScripts(script_arr, '/mypath/').done(function() {
    // all scripts loaded
});

trong đó đường dẫn sẽ được thêm vào tất cả các tập lệnh và cũng là tùy chọn, nghĩa là nếu mảng chứa URL đầy đủ thì người ta cũng có thể làm điều này và bỏ qua đường dẫn cùng nhau

$.getMultiScripts(script_arr).done(function() { ...

Luận cứ, lỗi v.v.

Bên cạnh đó, lưu ý rằng cuộc donegọi lại sẽ chứa một số đối số phù hợp với thông qua trong các tập lệnh, mỗi đối số đại diện cho một mảng chứa phản hồi

$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...

trong đó mỗi mảng sẽ chứa một cái gì đó như [content_of_file_loaded, status, xhr_object]. Nói chung, chúng tôi không cần phải truy cập vào các đối số đó vì các tập lệnh sẽ được tải tự động bằng mọi cách và hầu hết thời gian donegọi lại là tất cả chúng tôi thực sự sau khi biết rằng tất cả các tập lệnh đã được tải, tôi chỉ cần thêm nó cho đầy đủ và trong những trường hợp hiếm hoi khi văn bản thực tế từ tệp được tải cần được truy cập hoặc khi một người cần truy cập vào từng đối tượng XHR hoặc một cái gì đó tương tự.

Ngoài ra, nếu bất kỳ tập lệnh nào không tải được, trình xử lý lỗi sẽ được gọi và các tập lệnh tiếp theo sẽ không được tải

$.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
});

11
Cảm ơn câu trả lời tuyệt vời. Bạn có thể giải thích cho tôi tại sao thêm vào $.Deferred(function( deferred ){$( deferred.resolve );})đây?
soanch

11
Đối tượng bị trì hoãn thực sự không liên quan gì đến lời hứa cho phép bạn tải nhiều tập lệnh và thực hiện một chức năng khi tất cả đã hoàn thành. Nó kiểm tra xem $ () đã sẵn sàng chưa và giải quyết nếu nó, nói cách khác, nó kiểm tra xem DOM đã sẵn sàng trước khi thực hiện bất kỳ mã nào, giống như document. hứa hẹn sẽ có getScript trực tuyến có chức năng sẵn sàng DOM bị trì hoãn trong mã và chỉ quyết định giữ nó vì nó nghe có vẻ là một ý tưởng hay.
adeneo

4
Đó là vì bộ nhớ đệm trong ajax bị tắt theo mặc định trong jQuery, để bật và xóa chuỗi truy vấn: $.ajaxSetup({ cache: true });nhưng điều đó cũng có thể ảnh hưởng đến các cuộc gọi ajax khác mà bạn không muốn lưu vào bộ đệm, có nhiều hơn về điều này trong các tài liệu cho getScript và thậm chí còn có một chút cách để tạo một hàm getScript được lưu trong bộ nhớ cache có tên là cacheedScript.
adeneo

3
Xin lỗi vì sự chấp nhận muộn. Đôi khi cách của bạn vẫn không hoàn toàn làm việc. Không chắc lý do là gì. Tôi đang cố gắng kết hợp bốn tập tin kịch bản cùng một lúc. $.when($.getScript(scriptSrc_1), $.getScript(scriptSrc_2), $.getScript(scriptSrc_3), $.getScript(scriptSrc_4), $.Deferred(function(deferred) { $(deferred.resolve); })).done(function() { ... })
soanch

1
Đối với bất kỳ ai không thể làm việc này, hãy đảm bảo rằng không có lỗi phân tích cú pháp trong các tệp JS của bạn, tức là kiểm tra xem họ có tải đúng cách trong thẻ <script> trước không. jQuery.getScript () sẽ coi các lỗi này là tải không thành công và .fail () sẽ được gọi thay vì .done (). @SongtaoZ.
sức mạnh của lăng kính mặt trăng

29

Tôi đã triển khai một chức năng đơn giản để tải song song nhiều tập lệnh:

Chức năng

function getScripts(scripts, callback) {
    var progress = 0;
    scripts.forEach(function(script) { 
        $.getScript(script, function () {
            if (++progress == scripts.length) callback();
        }); 
    });
}

Sử dụng

getScripts(["script1.js", "script2.js"], function () {
    // do something...
});

1
Vì một số lý do, cái này hoạt động tốt hơn Emanuel. Đó là một thực hiện rất minh bạch quá.
Todd

@satnam cảm ơn :)! câu trả lời hàng đầu không làm việc cho một số người (bao gồm cả tôi) vì vậy tôi đã đăng giải pháp này. Và nó trông đơn giản hơn nhiều.
Andrei

10

Tải tập lệnh cần thiết lên trong phần gọi lại của tập trước như sau:

$.getScript('scripta.js', function()
{
   $.getScript('scriptb.js', function()
   {
       // run script that depends on scripta.js and scriptb.js
   });
});

1
Chắc chắn phương pháp này sẽ tải xuống các tập lệnh một cách tuần tự, làm chậm thời gian để thực hiện cuối cùng?
Jimbo

1
Đúng, @Jimbo - công bằng; tốt hơn là thực hiện sớm. :)
Alastair

Thác nước hầu như luôn luôn nên tránh. getScript đi kèm với một lời hứa ... Bạn có thể sử dụng $ .when để lắng nghe khi lời hứa được giải quyết.
Roi

@Roi và bất cứ ai khác: Nếu tôi cần các tập lệnh để tải theo thứ tự CỤ THỂ, về cơ bản, nói gì, có sai với phương pháp này không? Và lợi thế nào, do đó, lời hứa thay thế mang lại?
Ifedi Okonkwo

@ IfediOkonkwo điều này không hoạt động khi họ cần phải có trong loạt, nhưng orig op chỉ đề cập rằng anh ta muốn nhân lên cùng một lúc (trong đó, đây sẽ là một mô hình chống). Mặc dù sau đó, nếu tôi muốn chúng nối tiếp, tôi sẽ viết một hàm lặp mà tôi có thể truyền một mảng tới. Làm tổ sâu bị lộn xộn nhanh chóng.
Roi

9

Đôi khi cần phải tải các tập lệnh theo một thứ tự cụ thể. Ví dụ jQuery phải được tải trước UI UI. Hầu hết các ví dụ trên trang này tải các tập lệnh song song (không đồng bộ) có nghĩa là thứ tự thực hiện không được đảm bảo. Nếu không đặt hàng, tập lệnh yphụ thuộc vào xcó thể bị hỏng nếu cả hai được tải thành công nhưng sai thứ tự.

Tôi đề xuất một cách tiếp cận hỗn hợp cho phép tải tuần tự các tập lệnh phụ thuộc + tải song song tùy chọn + các đối tượng hoãn lại :

/*
 * loads scripts one-by-one using recursion
 * returns jQuery.Deferred
 */
function loadScripts(scripts) {
  var deferred = jQuery.Deferred();

  function loadScript(i) {
    if (i < scripts.length) {
      jQuery.ajax({
        url: scripts[i],
        dataType: "script",
        cache: true,
        success: function() {
          loadScript(i + 1);
        }
      });
    } else {
      deferred.resolve();
    }
  }
  loadScript(0);

  return deferred;
}

/*
 * example using serial and parallel download together
 */

// queue #1 - jquery ui and jquery ui i18n files
var d1 = loadScripts([
  "https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js",
  "https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/i18n/jquery-ui-i18n.min.js"
]).done(function() {
  jQuery("#datepicker1").datepicker(jQuery.datepicker.regional.fr);
});

// queue #2 - jquery cycle2 plugin and tile effect plugin
var d2 = loadScripts([
  "https://cdn.rawgit.com/malsup/cycle2/2.1.6/build/jquery.cycle2.min.js",
  "https://cdn.rawgit.com/malsup/cycle2/2.1.6/build/plugin/jquery.cycle2.tile.min.js"

]).done(function() {
  jQuery("#slideshow1").cycle({
    fx: "tileBlind",
    log: false
  });
});

// trigger a callback when all queues are complete
jQuery.when(d1, d2).done(function() {
  console.log("All scripts loaded");
});
@import url("https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/blitzer/jquery-ui.min.css");

#slideshow1 {
  position: relative;
  z-index: 1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<p><input id="datepicker1"></p>

<div id="slideshow1">
  <img src="https://dummyimage.com/300x100/FC0/000">
  <img src="https://dummyimage.com/300x100/0CF/000">
  <img src="https://dummyimage.com/300x100/CF0/000">
</div>

Các tập lệnh trong cả hai hàng đợi sẽ tải xuống song song, tuy nhiên, các tập lệnh trong mỗi hàng đợi sẽ tải xuống theo trình tự, đảm bảo thực hiện theo thứ tự. Biểu đồ thác nước:

biểu đồ thác nước của kịch bản


Chúng ta không cần thêm thẻ script trong HTML sau khi script được tải trong bộ nhớ?
Ankush Jain

4

Sử dụng yepnope.js hoặc Modernizr (bao gồm yepnope.js như Modernizr.load).

CẬP NHẬT

Chỉ cần theo dõi, đây là một tương đương tốt với những gì bạn hiện đang sử dụng yepnope, hiển thị sự phụ thuộc vào nhiều tập lệnh:

yepnope({
  load: ['script1.js', 'script2.js', 'script3.js'],
  complete: function () {
      // all the scripts have loaded, do whatever you want here
  }
});

Cảm ơn. Tôi có thể sử dụng nhiều yepnope.injectJs( scriptSource )ở đầu tệp javascript của mình giống như bao gồm <script>các thẻ trong tệp html không?
soanch

Điều đó mới và thành thật mà nói, tôi không hiểu tại sao nó lại cần thiết. Theo dõi tài liệu một chút qua danh sách các thay đổi gần đây và bạn sẽ thấy cách sử dụng thông thường hơn.
Chris Pratt

+1; đáng lưu ý rằng điều này quản lý đúng các phụ thuộc (nghĩa là sẽ không tải cùng một tập lệnh hai lần) không giống như $.getScript. Đây là một vấn đề lớn.
trứng

yepnope.js hiện không được chấp nhận .
Stephan

4

Tôi đã gặp phải một số vấn đề với tải đa tập lệnh, bao gồm một vấn đề với (ít nhất là trong Chrome) tải cùng một tập lệnh nóng không thực sự chạy sau khi được Ajax tải thành công khi Cross Domain hoạt động hoàn toàn tốt! :

Câu trả lời được chọn cho câu hỏi ban đầu không hoạt động đáng tin cậy.

Sau nhiều lần lặp lại ở đây là câu trả lời cuối cùng của tôi cho getScript và tải nhiều tập lệnh không đồng bộ theo một thứ tự nghiêm ngặt cụ thể với tùy chọn gọi lại được tải theo kịch bản và hoàn thành cuộc gọi lại khi hoàn thành, Đã thử nghiệm trong jQuery 2.1+ và các phiên bản hiện đại của Chrome, Firefox cộng với từ bỏ Internet Explorer.

Trường hợp thử nghiệm của tôi là tải các tệp cho kết xuất web của BA BA.JS sau đó bắt đầu tập lệnh kết xuất khi THREE toàn cầu có sẵn bằng cách sử dụng kiểm tra khoảng thời gian được chuyển đến một lệnh gọi hàm ẩn danh tới onComplete.

Hàm Prototype (getScripts)

function getScripts( scripts, onScript, onComplete )
{
    this.async = true;
    this.cache = false;
    this.data = null;
    this.complete = function () { $.scriptHandler.loaded(); };
    this.scripts = scripts;
    this.onScript = onScript;
    this.onComplete = onComplete;
    this.total = scripts.length;
    this.progress = 0;
};

getScripts.prototype.fetch = function() {
    $.scriptHandler = this;
    var src = this.scripts[ this.progress ];
    console.log('%cFetching %s','color:#ffbc2e;', src);

    $.ajax({
        crossDomain:true,
        async:this.async,
        cache:this.cache,
        type:'GET',
        url: src,
        data:this.data,
        statusCode: {
            200: this.complete
        },
        dataType:'script'
    });
};

getScripts.prototype.loaded = function () {
    this.progress++;
    if( this.progress >= this.total ) {
        if(this.onComplete) this.onComplete();
    } else {
        this.fetch();
    };
    if(this.onScript) this.onScript();
};

Cách sử dụng

var scripts = new getScripts(
    ['script1.js','script2.js','script.js'],
    function() {
        /* Optional - Executed each time a script has loaded (Use for Progress updates?) */
    },
    function () {
        /* Optional - Executed when the entire list of scripts has been loaded */
    }
);
scripts.fetch();

Hàm này giống như tôi đã tìm thấy bằng cách sử dụng Trì hoãn (Không dùng nữa?), Khi nào, Thành công & Hoàn thành trong các thử nghiệm của tôi KHÔNG đáng tin cậy 100%!?, Do đó, chức năng này và sử dụng statusCode chẳng hạn.

Bạn có thể muốn thêm vào hành vi xử lý lỗi / lỗi nếu bạn muốn.


+1 để tải chúng theo đúng thứ tự, thường là thiết yếu và câu trả lời được chấp nhận sẽ không đảm bảo trừ khi tôi thiếu thứ gì đó? Tôi đã đăng một câu trả lời ngắn hơn tương tự bên dưới nhưng đây là một trường hợp tổng quát hơn.
Whelkaholism 17/03 '

2

Bạn có thể sử dụng $.when-method bằng cách thử chức năng sau:

function loadScripts(scripts) {
  scripts.forEach(function (item, i) {
    item = $.getScript(item);
  });
  return $.when.apply($, scripts);
}

Hàm này sẽ được sử dụng như thế này:

loadScripts(['path/to/script-a.js', 'path/to/script-b.js']).done(function (respA, respB) {
    // both scripts are loaded; do something funny
});

Đó là cách sử dụng Lời hứa và có tối thiểu chi phí.


Điều này có đảm bảo các tập lệnh được tải theo trình tự không?
CyberMonk

2

Câu trả lời tuyệt vời, adeneo.

Tôi mất một chút thời gian để tìm ra cách làm cho câu trả lời của bạn chung chung hơn (để tôi có thể tải một mảng các tập lệnh được xác định mã). Gọi lại được gọi khi tất cả các tập lệnh đã được tải và thực thi. Đây là giải pháp của tôi:

    function loadMultipleScripts(scripts, callback){
        var array = [];

        scripts.forEach(function(script){
            array.push($.getScript( script ))
        });

        array.push($.Deferred(function( deferred ){
                    $( deferred.resolve );
                }));

        $.when.apply($, array).done(function(){
                if (callback){
                    callback();
                }
            });
    }

2

Nối các tập lệnh với async = false

Đây là một cách tiếp cận khác, nhưng siêu đơn giản. Để tải nhiều tập lệnh, bạn chỉ cần thêm chúng vào phần thân.

  • Tải chúng không đồng bộ, vì đó là cách trình duyệt tối ưu hóa tải trang
  • Thực thi các tập lệnh theo thứ tự, vì đó là cách trình duyệt phân tích các thẻ HTML
  • Không cần gọi lại, bởi vì các kịch bản được thực hiện theo thứ tự. Chỉ cần thêm một tập lệnh khác và nó sẽ được thực thi sau các tập lệnh khác

Thêm thông tin tại đây: https://www.html5rocks.com/en/tutorials/speed/script-loading/

var scriptsToLoad = [
   "script1.js", 
   "script2.js",
   "script3.js",
]; 
    
scriptsToLoad.forEach(function(src) {
  var script = document.createElement('script');
  script.src = src;
  script.async = false;
  document.body.appendChild(script);
});

1

Những gì bạn đang tìm kiếm là một trình tải tương thích AMD (như allow.js).

http://requirejs.org/

http://requirejs.org/docs/whyamd.html

Có nhiều mã nguồn mở tốt nếu bạn tìm kiếm nó. Về cơ bản, điều này cho phép bạn xác định một mô-đun mã và nếu nó phụ thuộc vào các mô-đun mã khác, nó sẽ đợi cho đến khi các mô-đun đó tải xuống xong trước khi tiếp tục chạy. Bằng cách này, bạn có thể tải 10 mô-đun không đồng bộ và sẽ không có vấn đề gì ngay cả khi một mô-đun phụ thuộc vào một vài mô-đun khác để chạy.


1

Hàm này sẽ đảm bảo rằng một tệp được tải sau khi tệp phụ thuộc được tải hoàn toàn. Bạn chỉ cần cung cấp các tệp theo trình tự ghi nhớ các phụ thuộc vào các tệp khác.

function loadFiles(files, fn) {
    if (!files.length) {
        files = [];
    }
    var head = document.head || document.getElementsByTagName('head')[0];

    function loadFile(index) {
        if (files.length > index) {
            var fileref = document.createElement('script');
            fileref.setAttribute("type", "text/javascript");
            fileref.setAttribute("src", files[index]);
            head.appendChild(fileref);
            index = index + 1;
            // Used to call a callback function
            fileref.onload = function () {
                loadFile(index);
            }
        } else if(fn){
            fn();
        }
    }
    loadFile(0);
}

Có lẽ tốt hơn câu trả lời được chấp nhận vì nó tải các tệp theo thứ tự. Nếu script2 yêu cầu script1 được tải thì việc đặt hàng là điều cần thiết.
Salman A

1

Điều này làm việc cho tôi:

function getScripts(scripts) {
    var prArr = [];
    scripts.forEach(function(script) { 
        (function(script){
            prArr .push(new Promise(function(resolve){
                $.getScript(script, function () {
                    resolve();
                });
            }));
        })(script);
    });
    return Promise.all(prArr, function(){
        return true;
    });
}

Và sử dụng nó:

var jsarr = ['script1.js','script2.js'];
getScripts(jsarr).then(function(){
...
});

1

Dưới đây là câu trả lời bằng cách sử dụng Maciej Sawicki's và thực hiện Promisedưới dạng gọi lại:

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);
        });
    });
}

Sử dụng:

let JSDependencies = ["jquery.js",
                      "LibraryNeedingJquery.js",
                      "ParametersNeedingLibrary.js"];

loadScripts(JSDependencies,'JavaScript/').then(taskNeedingParameters);

Tất cả các tệp Javascript được tải xuống càng sớm càng tốt và được thực hiện theo thứ tự nhất định. Sau đó taskNeedingParametersđược gọi.


0

Phiên bản ngắn hơn của câu trả lời toàn diện của Andrew Marc Newton ở trên. Điều này không kiểm tra mã trạng thái để thành công, mà bạn nên làm để tránh hành vi UI không xác định.

Hệ thống này dành cho một hệ thống gây phiền nhiễu, nơi tôi có thể đảm bảo jQuery nhưng không có hệ thống nào khác, vì vậy tôi muốn một kỹ thuật đủ ngắn để không bị đưa vào một tập lệnh bên ngoài nếu bị ép buộc vào nó. (Bạn có thể làm cho nó thậm chí ngắn hơn bằng cách chuyển chỉ số 0 đến cuộc gọi "đệ quy" đầu tiên nhưng lực lượng của thói quen phong cách khiến tôi thêm đường).

Tôi cũng đang gán danh sách phụ thuộc cho tên mô-đun, do đó, khối này có thể được bao gồm ở bất cứ đâu bạn cần "module1" và các tập lệnh và khởi tạo phụ thuộc sẽ chỉ được đưa vào / chạy một lần (bạn có thể đăng nhập indexvào cuộc gọi lại và xem một đơn đặt hàng tập hợp các yêu cầu AJAX đang chạy)

if(typeof(__loaders) == 'undefined') __loaders = {};

if(typeof(__loaders.module1) == 'undefined')
{
    __loaders.module1 = false;

    var dependencies = [];

    dependencies.push('/scripts/loadmefirst.js');
    dependencies.push('/scripts/loadmenext.js');
    dependencies.push('/scripts/loadmelast.js');

    var getScriptChain  = function(chain, index)        
    {
        if(typeof(index) == 'undefined')
            index = 0;

        $.getScript(chain[index], 
            function()
            {
                if(index == chain.length - 1)
                {
                    __loaders.module1 = true;

                    /* !!!
                        Do your initialization of dependent stuff here 
                    !!! */
                }
                else 
                    getScriptChain(chain, index + 1);
            }
        );
    };

    getScriptChain(dependencies);       
}

0

Có một plugin ngoài đó mở rộng phương thức getScript của jQuery. Cho phép tải không đồng bộ và đồng bộ và sử dụng cơ chế bộ đệm của jQuery. Tiết lộ đầy đủ, tôi đã viết này. Xin vui lòng đóng góp nếu bạn tìm thấy một phương pháp tốt hơn.

https://github.com/hudsonfoo/jquery-getscripts


0

Tải lần lượt n tập lệnh (hữu ích nếu ví dụ tập tin thứ 2 cần tập 1):

(function self(a,cb,i){
    i = i || 0; 
    cb = cb || function(){};    
    if(i==a.length)return cb();
    $.getScript(a[i++],self.bind(0,a,cb,i));                    
})(['list','of','script','urls'],function(){console.log('done')});

0

dựa trên câu trả lời từ @adeneo ở trên: Kết hợp cả tải tập tin css và js

bất kỳ đề xuất cải tiến ??

// Usage
//$.getMultiResources(['script-1.js','style-1.css'], 'assets/somePath/')
//  .done(function () {})
//  .fail(function (error) {})
//  .always(function () {});

(function ($) {
  $.getMultiResources = function (arr, pathOptional, cache) {
    cache = (typeof cache === 'undefined') ? true : cache;
    var _arr = $.map(arr, function (src) {
      var srcpath = (pathOptional || '') + src;
      if (/.css$/i.test(srcpath)) {
        return $.ajax({
          type: 'GET',
          url: srcpath,
          dataType: 'text',
          cache: cache,
          success: function () {
            $('<link>', {
              rel: 'stylesheet',
              type: 'text/css',
              'href': srcpath
            }).appendTo('head');
          }
        });

      } else {
        return $.ajax({
          type: 'GET',
          url: srcpath,
          dataType: 'script',
          cache: cache
        });
      }
    });
    //
    _arr.push($.Deferred(function (deferred) {
      $(deferred.resolve);
    }));
    //
    return $.when.apply($, _arr);
  };
})(jQuery);

0

Bạn có thể thử cái này bằng cách sử dụng đệ quy. Điều này sẽ tải chúng đồng bộ, lần lượt từng cái cho đến khi hoàn thành tải xuống toàn bộ danh sách.

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();
    });
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.