2012-03-25 3 views
11

Я хочу иметь одну функцию обратного вызова после того, как действия выполняются, я пытаюсь что-то вроде этого:Jquery .when и несколько .load

$.when(
    $('#detail1').load('/getInfo.php'), 
    $('#detail2').load('/getOther.php') 
     ).then(function(a,b){ 
      alert("done"); 
     }); 

Проблема заключается в том, что функция обратного вызова Перед обжигом действия законченный.

+1

У вас есть дополнительный ')' там. –

+0

@JosephSilber Я только что исправил. Но все равно проблема – dimirc

ответ

24

Это связано с тем, что jQuery.when() ожидает экземпляры jQuery.Deferred, в то время как load() возвращает экземпляр jQuery (см. и http://api.jquery.com/load/).

Вы можете обойти эту проблему:

// Create two Deferred instances that can be handed to $.when() 
var d1 = new $.Deferred(); 
var d2 = new $.Deferred(); 

// Set up the chain of events... 
$.when(d1, d2).then(function() { 
    alert('done'); 
}); 

// And finally: Make the actual ajax calls: 
$('#detail1').load('/getInfo.php', function() { d1.resolve(); }); 
$('#detail2').load('/getOther.php', function() { d2.resolve(); }); 
+1

Не нужно вызывать $ .Deferred() с 'новым'. Это заводская функция. – backdesk

+0

это блестящий –

7

Я делаю похожий код, но и для изображений в более динамично. Надеюсь, что это поможет.

var deferreds = []; 
// Create a deferred for all images 
$('.my-img-class').each(function() { 
    deferreds.push(new $.Deferred()); 
}); 
var i = 0; 
// When image is loaded, resolve the next deferred 
$('.my-img-class').load(function() { 
    deferreds[i].resolve(); 
    i++; 
}); 
// When all deferreds are done (all images loaded) do some stuff 
$.when.apply(null, deferreds).done(function() { 
    // Do some stuff 
}); 
+0

+1 для '$ .when.apply()'. Так или иначе, мой код не работал, пока я не добавил '.apply'. Спасибо – Dejisys

+0

Так спасибо за этот ответ! – nickvans