jQuery: выполнение кода после полного завершения каждого(), содержащего load()

Возможный дубликат:
Несколько ajax-вызовов внутри функции each().. затем сделать что-то, когда ВСЕ из них будут завершены?

По сути, я хочу запустить функцию после полного завершения цикла each(), содержащего load() для каждого цикла. Загрузка каждой ссылки занимает некоторое время и ждет, пока браузер наверстает упущенное, но скрипт уже перешел к следующему шагу. Есть идеи?

jQuery('#theId a').each(function() { // contains many links
    toLoad = jQuery(this).attr('href');
    jQuery('#containment').load(toLoad, function(response) {
       //do stuff
    });
 });

//... Do stuff after the above is really complete.

person Kyle Comstock    schedule 10.02.2012    source источник
comment
используйте параметр индекса каждого() для подсчета объектов и используйте обратный вызов загрузки для условия   -  person ggzone    schedule 10.02.2012
comment
Лучший способ сделать это — использовать отложенные объекты. Я собирался опубликовать пример, но увидел ссылку выше. Используйте верхний ответ из этого вопроса.   -  person James Allardice    schedule 10.02.2012
comment
Не могли бы вы сначала добавить класс к последнему элементу ($('a:last').addClass('lastlink');), а затем, когда вы перебираете все ссылки и запускаете load(), просто вызываете функцию, содержащую все, что вы хотите выполнить, из обратного вызова load() если элемент, на котором вы находитесь, имеет класс, который вы назначили ранее («последняя ссылка»)?   -  person j08691    schedule 10.02.2012
comment
@ j08691 - Что, если один из предыдущих асинхронных запросов еще не вернулся?   -  person James Allardice    schedule 10.02.2012


Ответы (1)


Попробуйте что-то вроде этого:

var e = jQuery("#theId a"), l = e.length;
e.each(function() {
    toLoad = this.attr("href"); // I'm fairly sure "this" is already a jQuery object
    jQuery("#containment").load(toLoad, function(response) {
        // do stuff
        l--;
        if( l == 0) {
            // this is the last one - do ending stuff here.
        }
    });
});

Если «это» еще не объект jQuery, просто верните эту строку к тому, что у вас есть.

person Niet the Dark Absol    schedule 10.02.2012
comment
this относится к элементу DOM. - person Felix Kling; 10.02.2012
comment
Достаточно честно - я никогда не использую jQuery, поэтому я не знаю: D - person Niet the Dark Absol; 10.02.2012
comment
Это сработало отлично. Спасибо! - person Kyle Comstock; 11.02.2012