Ответ 1
animate вызывает свой обратный вызов один раз для каждого элемента в наборе, который вы вызываете animate on:
Если он поставляется, вызовы
start,step,progress,complete,done,failиalwaysвызываются на основе каждого элемента...
Поскольку вы анималируете два элемента (элемент html и элемент body), вы получаете два обратных вызова. (Для тех, кто задается вопросом, почему OP оживляет два элемента, это потому, что анимация работает на body на некоторых браузерах, но на html на других браузерах.)
Чтобы получить один обратный вызов, когда анимация завершена, документы animate указывают на использование метода promise, чтобы получить обещание очереди анимации, а затем then для очереди обратного вызова:
$("html, body").animate(/*...*/)
.promise().then(function() {
// Animation complete
});
(Примечание: Кевин Б указал на это в своем ответе, когда вопрос был задан впервые. Я не делал этого четыре года спустя, когда заметил, что он отсутствует, добавив его, и... затем увидел, что Кевин отвечает. Пожалуйста, дайте ему ответ, которого он заслуживает. Я понял, что это принятый ответ, я должен оставить его.)
Здесь показан пример, показывающий обратные вызовы отдельных элементов и общий обратный вызов завершения:
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>