2009-05-26 5 views
17

Wenn ich die Fade/Folie/animieren Funktionen in jQuery verwenden, wird der Rückruf für jedes Element, auf das der Effekt angewendet wird, mehrmals aufgerufen. Dies ist natürlich beabsichtigt. Ich möchte nur wissen, wann der letzte Callback angerufen wird.jquery Callbacks, die mehrmals aufgerufen werden

Hier ist, was ich gefunden habe - es blendet alle Divs aus und zeigt eine Warnung() an, wenn der letzte Callback ausgelöst wird.

$("div").fadeOut(1000, function() 
{ 
    if ($("div").index($(this)) == $("div").length-1) 
      alert("this is the final callback"); 
}); 

Gibt es einen einfacheren Weg, die Rückruf zu überprüfen die letzte ist, oder ist dies der einzige Weg, es zu tun?

Antwort

17

, der die Warnung, wenn der fadeOut auf dem letzten Element erzeugen würde genannt wurde. Das wäre nicht unbedingt das letzte fadeOut.

var numDivs = $('div').length; 
$('div').fadeOut(1000, function() { 
    if(--numDivs > 0) return; 
    alert('this is the final fadeout to complete'); 
}); 

Check it out auf JSFiddle

+0

Ahhh, ich verstehe was du sagst. Guter Anruf! – Gromer

+0

yep, gutes Denken. Ich mag auch die anderen Lösungen, aber diese ist zu 100% korrekt. –

+0

Wo ist die Anzahl definiert? –

1
$("div:not(:last)").fadeOut(1000); 
$("div:last").fadeOut(1000, function() { 
    alert("Hey!"); 
}); 
+0

tun konnte, schön, ich habe nicht() vorher nicht benutzt. gut zu wissen! –

46

Versuchen Sie einen Blick auf the jQuery documentation for .promise()

Einnahme dieser Arbeit sollte:

$('div').fadeOut(1000).promise().done(function() { 
    alert('all done'); 
}); 

Als usualy, auf das die jQuery-Dokumentation wirklich vage. Aber ich bin mir nicht sicher, dass ich

+0

FANTASTISCH! Ich habe es ausprobiert und es funktioniert: http://jsfiddle.net/MP26y/ – geon

+1

Das einzige Problem mit dieser Methode ist, dass es wartet, bis alle Anrufe beendet sind. Wenn Sie also eine Schaltfläche haben, die diese Funktion aktiviert und mehrmals darauf klickt, wird sie nicht mehr ausgelöst, wenn sie die Animation jedes Mal beendet. Es wird mehrmals ausgeblendet und danach alle Versprechen Funktionen aufrufen. Unter bestimmten Umständen ist dies nicht die beste Lösung. – Rumpleteaser

+0

Sie können auch die Methode [jQuery's .finish()] (http://api.jquery.com/?s=finish%28%29) ausprobieren, die die oben genannten Probleme mit mehreren Klicks beheben kann. – matlembo