2011-09-15 22 views
12

Desidero utilizzare la funzione load di jQuery per caricare alcuni contenuti in un div e voglio anche chiamare la funzione animate di jQuery.jquery attendere più eventi completi

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

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

Non voglio aspettare che load completare prima di chiamare animate o viceversa.

In seguito, desidero chiamare una terza funzione, ma non desidero richiamarla fino a quando non è stato attivato l'evento completo sia per load sia per animate.

Come posso fare questo?

risposta

39

Suona come un lavoro per 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 (...)' non restituisce un oggetto deffered! (e penso che '.load' non sia ...) –

+2

In realtà, le animazioni funzionano come posticipate: http://bugs.jquery.com/ticket/7934. Non sono sicuro di come '.load' funzioni. – qerub

+2

WOW! Non lo sapevo! La cosa interessante, però, è che la * jQuery collection stessa * viene posticipata: http://jsfiddle.net/jgbUX/. ** Davvero interessante. ** –

2

Impostare un flag in LoadComplete e chiamare la propria funzione 'allComplete'. Imposta un altro flag in AnimateComplete e chiama la stessa funzione 'allComplete'.

In tuttoCompleto si controlla se entrambi i flag sono impostati. Se lo sono, entrambe le funzioni asincrone sono complete e puoi chiamare la terza funzione.

Invece di impostare flag (variabili separate), è possibile anche aggiungere 1 a un contatore globale, in questo modo, è possibile aumentare il numero di funzioni asincrone da attendere senza dover introdurre variabili di flag aggiuntive.

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

sicuramente valida se si chiama 'checkComplete()' 'sia dal .load()' e '.animate()' Dontcha pensi? ;) – f0x

+0

ahahhh touche :) – BumbleB2na

3

Dovrete tenere il conto di quanti dei vostri eventi hanno completato, e quindi utilizzare che come un test nel vostro 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

Usa:

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

In questo modo è possibile mettere in coda le funzioni per eseguirne una dopo l'altra.

Problemi correlati