color - jquery animate then
La devoluciĆ³n de llamada de.animate() se llama dos veces jquery (2)
Para obtener una devolución de llamada única para la finalización de animaciones de elementos múltiples, use objetos diferidos.
$(".myClass").animate({
marginLeft: "30em"
}).promise().done(function(){
alert("Done animating");
});
Consulte la API de jQuery para obtener una descripción detallada de los objetos promise y Diferida .
Desde que agregué algunos scrollTop
-animation, algunas partes de mi callback se llaman dos veces:
$(''html, body'').animate({scrollTop: ''0px''}, 300,function() {
$(''#content'').load(window.location.href, postdata, function() {
$(''#step2'').addClass(''stepactive'').hide().fadeIn(700, function() {
$(''#content'').show(''slide'',800);
});
});
});
Parece que solo repite .show()
, al menos no tengo la impresión de que load()
o .fadeIn()
se .fadeIn()
segunda vez. El .show()
se repite tan pronto como termina por primera vez. Establecer la velocidad de animación scrollTop en 0
no ayudó por cierto!
Supongo que tiene algo que ver con la cola de animación, pero no puedo encontrar la forma de encontrar una solución y especialmente por qué está sucediendo esto.
animate
llamadas animate
devuelven la devolución de llamada una vez por cada elemento del conjunto al que llamas animate
:
Si se proporciona, las llamadas de
start
,step
,progress
,complete
,done
,fail
yalways
invocan por elemento ...
Como estás animando dos elementos (el elemento html
y el elemento body
), obtienes dos devoluciones de llamada. (Para cualquiera que se pregunte por qué el OP está animando dos elementos, es porque la animación funciona en el body
en algunos navegadores pero en html
en otros navegadores).
Para obtener una devolución de llamada única cuando se completa la animación, los documentos animate
indican que use el método de promise
para obtener una promesa para la cola de animación, y luego usarla then
poner en cola la devolución de llamada:
$("html, body").animate(/*...*/)
.promise().then(function() {
// Animation complete
});
(Nota: Kevin B señaló esto en su respuesta cuando se formuló la pregunta por primera vez. No lo hice hasta cuatro años más tarde cuando noté que faltaba, la agregué y ... luego vi la respuesta de Kevin. Responda la respuesta Merece la pena. Me di cuenta de que como esta es la respuesta aceptada, debería dejarla en.)
Aquí hay un ejemplo que muestra las devoluciones de llamadas de los elementos individuales y la devolución de llamada completa completa:
jQuery(function($) {
$("#one, #two").animate({
marginLeft: "30em"
}, function() {
// Called per element
display("Done animating " + this.id);
}).promise().then(function() {
// Called when the animation in total is complete
display("Done with animation");
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
});
<div id="one">I''m one</div>
<div id="two">I''m two</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>