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
});
(หมายเหตุ: Kevin B ชี้สิ่งนี้ในคำตอบของเขาเมื่อคำถามถูกถามครั้งแรกฉันไม่ได้ทำจนกระทั่งสี่ปีต่อมาเมื่อฉันสังเกตเห็นว่ามันหายไปเพิ่มเข้าไปและ ... จากนั้นก็เห็นคำตอบของ Kevin โปรดให้คำตอบของเขา รักที่สมควรได้รับฉันคิดว่านี่คือคำตอบที่ได้รับการยอมรับฉันควรปล่อยไว้)
นี่คือตัวอย่างที่แสดงทั้งการเรียกกลับของแต่ละองค์ประกอบและการโทรกลับโดยรวม:
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
ใช่ว่าเป็นเหตุผลและที่จริงผมจำไม่ได้ว่าทำไมผมเคยเขียน ถึงเวลาเปิดสมองของฉันอีกครั้ง ขอบคุณ