animate
викликає зворотний виклик один раз для кожного елемента в наборі, на який ви дзвоните animate
:
При поставці, то start
, step
, progress
, complete
, done
, fail
, і always
зворотні виклики називаються на основі кожного елемента ...
Оскільки ви анімуєте два елементи ( html
елемент і body
елемент), ви отримуєте два зворотних виклику. (Для всіх, хто цікавиться, чому ОП анімує два елементи, це тому, що анімація працює 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>
html, body
. Час повернути мозок. Спасибі