Событие jquery сработало, когда все jquery.loads завершены? - PullRequest
0 голосов
/ 20 марта 2012

У меня есть следующий код:

$(function () {
    $("#ARO").load('/DA.aspx?section=ARO #ARO', function() {
        DoSomething1();
    });
    $("#ERO").load('/DA.aspx?section=ERO #ERO', function() {
        DoSomething2();
    });
    $("#IRO").load('/DA.aspx?section=IRO #IRO', function() {
        DoSomething3();
    });
    $("#ORO").load('/DA.aspx?section=ORO #ORO', function() {
        DoSomething4();
    });
    CodeIWishToExecuteAfterAllLoads();
});

Как вы знаете, загрузка jquery асинхронна! поэтому функция «CodeIWishToExecuteAfterAllLoads ()» будет выполнена до завершения всех событий загрузки.

Мне нужно событие или какой-нибудь способ получить "CodeIWishToExecuteAfterAllLoads ()" выполнено после того, как все загрузки завершены

У кого-нибудь есть идеи, как этого добиться?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Вы можете сделать это:

var loaded = 0;
var expected = 4;
var record_load = function(){
    loaded++;
    if(loaded == expected)
        CodeIWishToExecuteAfterAllLoads();
}

$("#ARO").load('/DA.aspx?section=ARO #ARO', function() {
    DoSomething1();
    record_load();
});
$("#ERO").load('/DA.aspx?section=ERO #ERO', function() {
    DoSomething2();
    record_load();
});
$("#IRO").load('/DA.aspx?section=IRO #IRO', function() {
    DoSomething3();
    record_load();
});
$("#ORO").load('/DA.aspx?section=ORO #ORO', function() {
    DoSomething4();
    record_load();
});
0 голосов
/ 20 марта 2012

Вот что я сделал с jQuery Отложено .

Мне нужно было загрузить данные для нескольких различных диаграмм, и как только все данные отдельных диаграмм были загружены, я хотел объединить данные и диаграмму , что .

Utils = {
  createCharts: function (){
    Utils.initializeCharts();
    Utils.createUserCharts();
  },

  initializeCharts: function (){
    Utils.deferred = $.Deferred().done(function (){
      Utils.createAggregateCharts();
    });

    Utils.remainingCharts = $(".user").size();
  },

  decrementRemainingCharts: function (){
    --Utils.remainingCharts;
    if (Utils.remainingCharts == 0){
      Utils.deferred.resolve();
    }
  },

  createUserCharts: function (){
    $(".user").each(function (i, user){

      // ...

      $.get(href, function (response){
        Utils.chart(chart_id, response);
        Utils.decrementRemainingCharts();
      });
    });
  },

  chart: function (){
    // ...
  },

  createAggregateCharts: function (){
    // ...
  }
};

По сути, вы создаете объект Deferred с функцией, которая вызывается, когда она "разрешена". Затем, основываясь на каком-то внешнем условии, вы решаете, когда позвонить Deferred.resolve. Это очень элегантно.

0 голосов
/ 20 марта 2012
$(function () {
    $("#ARO").load('/DA.aspx?section=ARO #ARO', function() {
        DoSomething1();
         $("#ERO").load('/DA.aspx?section=ERO #ERO', function() {
            DoSomething2();
            $("#IRO").load('/DA.aspx?section=IRO #IRO', function() {
                DoSomething3();
                $("#ORO").load('/DA.aspx?section=ORO #ORO', function() {
                    DoSomething4();
                    CodeIWishToExecuteAfterAllLoads();
                });
            });
         });
    });

});

Это должно работать все по порядку. Если нет, вы можете использовать метод setTimeout (), чтобы обеспечить ручную задержку на несколько миллисекунд и выполнить ваш CodeIWishToExecuteAfterAllLoads();

Хопт, это то, что вы ищете.

...