animate
gọi lại nó một lần cho mỗi phần tử trong tập hợp bạn gọi animate
:
Nếu cung cấp, start
, step
, progress
, complete
, done
, fail
, và always
callbacks được gọi là trên một cơ sở cho mỗi yếu tố ...
Vì bạn đang tạo hoạt ảnh cho hai phần tử ( html
phần tử và body
phần tử), bạn sẽ nhận được hai lần gọi lại. (Đối với bất kỳ ai thắc mắc tại sao OP lại tạo hoạt ảnh cho hai phần tử, đó là vì hoạt ảnh hoạt động body
trên một số trình duyệt nhưng html
trên các trình duyệt khác.)
Để nhận được một lệnh gọi lại duy nhất khi hoạt ảnh hoàn tất, animate
tài liệu hướng bạn đến bằng cách sử dụng promise
phương thức để nhận lời hứa cho hàng đợi hoạt ảnh, sau đó sử dụng then
để xếp hàng gọi lại:
$("html, body").animate(/*...*/)
.promise().then(function() {
// Animation complete
});
(Lưu ý: Kevin B đã chỉ ra điều này trong câu trả lời của anh ấy khi câu hỏi được đặt ra lần đầu tiên. Tôi cho đến bốn năm sau khi nhận thấy câu trả lời bị thiếu, đã thêm nó và ... sau đó xem câu trả lời của Kevin. Vui lòng cho câu trả lời của anh ấy yêu nó xứng đáng. Tôi đã nghĩ rằng đây là câu trả lời được chấp nhận, tôi nên để nó trong.)
Dưới đây là một ví dụ hiển thị cả lệnh gọi lại phần tử riêng lẻ và lệnh gọi lại hoàn thành tổng thể:
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
. Đã đến lúc tôi bật não trở lại. Cảm ơn