2011-09-15 17 views
12

Chcę użyć funkcji jQuery's load do załadowania niektórych treści do div, i chcę również wywołać funkcję jQuery's animate.jquery czekać na wiele kompletnych zdarzeń

$('#div1').load('...', function() { 
    // load complete 
}); 

$('html,body').animate({ 
    ...: ...}, ..., '...', function(){ 
    // animate complete 
}); 

Nie chcę czekać na load aby zakończyć przed wywołaniem animate lub odwrotnie.

W następstwie tego chcę wywołać trzecią funkcję, ale nie chcę jej wywoływać, dopóki nie zostanie wyzwolone całe zdarzenie zarówno dla load, jak i dla animate.

Jak mogę to zrobić?

Odpowiedz

39

Brzmi jak zadanie dla Deferred: http://api.jquery.com/category/deferred-object/

var load = $.Deferred(function (dfd) { 
    $('#div1').load(…, dfd.resolve); 
}).promise(); 

var animate = $('html,body').animate(…); 

$.when(load, animate).then(function() { 
    // Do your thing here! 
}); 
+1

'.animate (...)' nie zwraca opróżnionego! (i myślę, że '.load' też nie ...) –

+2

W rzeczywistości animacje działają jak odroczone: http://bugs.jquery.com/ticket/7934. Nie jestem pewien, jak działa '.load'. – qerub

+2

WOW! Nie wiedziałem tego! Co ciekawe, sama * kolekcja jQuery * staje się odroczona: http://jsfiddle.net/jgbUX/. ** Naprawdę interesujące. ** –

2

Ustaw flagę w LoadComplete i wywołaj własną funkcję "allComplete". Ustaw inną flagę w aplikacji AnimateComplete i wywołaj tę samą funkcję "allComplete".

W allComplete sprawdzasz, czy obie flagi są ustawione. Jeśli tak, obie funkcje asynchroniczne są kompletne i możesz wywołać trzecią funkcję.

Zamiast ustawiać flagi (oddzielne zmienne), można również dodać 1 do licznika globalnego, dzięki czemu można zwiększyć liczbę funkcji asynchronicznych, na które można czekać bez konieczności wprowadzania dodatkowych zmiennych flag.

5
var _loadComplete = false; 
var _animateComplete = false; 

$('#div1').load('...', function() { 
    // load complete 
    _loadComplete = true; 
    checkComplete(); 
}); 

$('html,body').animate({ 
    ...: ...}, ..., '...', function(){ 
    // animate complete 
    _animateComplete = true; 
    checkComplete(); 
}); 

function checkComplete() { 
    if(_loadComplete && _animateComplete) 
     runThirdFunction(); 
}); 
+0

zdecydowanie opłacalne jeśli zadzwonisz 'checkComplete()' 'zarówno z .load()' oraz '.animate()' dontcha myśleć? ;) – f0x

+0

ahahhh touche :) – BumbleB2na

3

Musisz zachować rachubę ilu imprezach zakończyły, a następnie użyć jej jako test w swojej callback:

var complete = 0; 

$('#div1').load('...', function() { 
    complete++; 
    callback(); 
}); 
$('html,body').animate({ 
    ...: ...}, ..., '...', function(){ 
    complete++; 
    callback(); 
}); 

function callback(){ 
    if (complete < 2) return; 
    // both are complete 
} 
1

Zastosowanie:

$('#div1').queue(function(){ /* do stuff */ }); 

W ten sposób możesz kolejkować funkcje, aby wykonać jedną po drugiej.

Powiązane problemy