animate
wywołuje swoje wywołanie zwrotne raz dla każdego elementu w przywoływanym zestawie animate
:
Jeśli podany, start
, step
, progress
, complete
, done
, fail
, i always
wywołania zwrotne są nazywane na podstawie na elemencie ...
Ponieważ animujesz dwa elementy ( html
element i body
element), otrzymujesz dwa wywołania zwrotne. (Dla każdego, kto zastanawia się, dlaczego OP animuje dwa elementy, dzieje się tak dlatego, że animacja działa body
w niektórych przeglądarkach, ale html
w innych)
Aby uzyskać pojedyncze wywołanie zwrotne po zakończeniu animacji, animate
dokumenty wskazują, że należy użyć promise
metody, aby uzyskać obietnicę kolejki animacji, a następnie użyć then
do kolejkowania wywołania zwrotnego:
$("html, body").animate(/*...*/)
.promise().then(function() {
// Animation complete
});
(Uwaga: Kevin B zwrócił na to uwagę w swojej odpowiedzi, kiedy zadawano to pytanie. Dopiero cztery lata później zauważyłem, że go brakuje, dodałem go i ... potem zobaczyłem odpowiedź Kevina. Proszę, podaj jego odpowiedź uwielbiam, na to zasługuje. Pomyślałem, że skoro jest to akceptowana odpowiedź, powinienem ją zostawić).
Oto przykład pokazujący zarówno wywołania zwrotne poszczególnych elementów, jak i ogólne wywołanie zwrotne zakończenia:
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
. Czas z powrotem włączyć mój mózg. Dziękihtml
jest wymagany dla IE, a wywołanie zwrotne zostanie uruchomione dwukrotnie w przypadku większości innych przeglądarek. Próbuję znaleźć rozwiązanie tego samego problemu.var ranOne = false; $('body,html').animate({ scrollTop: scrollTo }, scrollTime, 'swing', function () { if (ranOne) { ...action... ranOne = false; } else { ranOne = true; } });
wydaje się, że to hacky, ale konieczność używania „body, html” jest po pierwsze trochę hakerska, więc. (ech przepraszam za brakAby uzyskać pojedyncze wywołanie zwrotne w celu zakończenia animacji wielu elementów, użyj obiektów odroczonych.
Zobacz interfejs API jQuery, aby uzyskać szczegółowy opis obiektów Promise i Deferred .
źródło