2009-05-26 14 views
17

Cuando utilizo el fundido/slide/animar funciones en jQuery la devolución de llamada se vuelve a llamar varias veces para cada elemento el efecto se aplica a. Esto es por diseño, por supuesto. Solo quiero saber cuándo se llama la última devolución de llamada.devoluciones de llamada jquery siendo llamados varias veces

Esto es lo que ocurrió con- se desvanece toda la divs y muestra una alerta() cuando se dispara la última devolución de llamada.

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

¿Hay una manera más sencilla para comprobar qué devolución de llamada es el último o se trata de la única manera de hacerlo?

Respuesta

17

Eso produciría la alerta cuando se llama al fadeOut en el último elemento. Eso no sería necesariamente el último fadeOut.

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

Compruébelo usted mismo en JSFiddle

+0

Ahhh, veo lo que dices. ¡Buena llamada! – Gromer

+0

sí, buen pensamiento. Me gustan las otras soluciones también, pero esta es 100% correcta. –

+0

¿Dónde se define el recuento? –

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

agradable, no he utilizado no() antes. ¡bueno saber! –

46

Trate de tomar un vistazo a the jQuery documentation for .promise()

Esto debería funcionar:

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

Como usualy, la documentación de jQuery en este es muy vaga. Pero no estoy seguro de que podría hacer

+0

¡IMPRESIONANTE! Lo probé y funciona: http://jsfiddle.net/MP26y/ – geon

+1

El único problema con este método es que espera hasta que todas las llamadas hayan finalizado. por lo tanto, si tiene un botón que activa esa función y lo hace clic varias veces, no se disparará después de que termine la animación cada vez. se desvanecerá varias veces y luego llamará a todas las funciones de promesa después de eso. Entonces, en algunas circunstancias, no es la mejor solución. – Rumpleteaser

+0

Es posible que también desee verificar el [método de jQuery .finish()] (http://api.jquery.com/?s=finish%28%29), que puede aliviar los múltiples problemas de clics mencionados anteriormente. – matlembo

Cuestiones relacionadas