animate
вызывает свой обратный вызов один раз для каждого элемента в наборе, который вы вызываете animate
:
При поставке, то 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>
html, body
. Пора снова включить мой мозг. Спасибоhtml
требуется для IE, а обратный вызов будет срабатывать дважды для большинства других браузеров. Я пытаюсь найти решение той же проблемы.var ranOne = false; $('body,html').animate({ scrollTop: scrollTo }, scrollTime, 'swing', function () { if (ranOne) { ...action... ranOne = false; } else { ranOne = true; } });
это кажется хакерским, но необходимость использовать "body, html" - это в первую очередь хакерство, так что. (эх извините за отсутствие разрывов строк, думаю, в комментариях их не видно)Чтобы получить один обратный вызов для завершения анимации нескольких элементов, используйте отложенные объекты.
Подробное описание обещаний и отложенных объектов см. В jQuery API .
источник