[jquery] .animate () 콜백이 두 번 호출됩니다.
scrollTop
-animation을 추가했기 때문에 콜백의 일부가 두 번 호출됩니다.
$('html, body').animate({scrollTop: '0px'}, 300,function() {
$('#content').load(window.location.href, postdata, function() {
$('#step2').addClass('stepactive').hide().fadeIn(700, function() {
$('#content').show('slide',800);
});
});
});
그것은 단지를 반복하는 것 같습니다 .show()
, 적어도 나는 load()
또는 .fadeIn()
두 번째로 호출되는 인상을 가지고 있지 않습니다 . 는 .show()
즉시이 처음으로 끝난 반복됩니다. 0
그런데 scrollTop 애니메이션 속도를 설정하는 것은 도움이되지 않았습니다!
나는 그것이 애니메이션 대기열과 관련이 있다고 가정하지만 해결 방법을 찾는 방법과 특히 이것이 발생하는 이유 를 알 수 없습니다 .
답변
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는 질문이 처음 질문되었을 때 그의 답변 에서이 점 을 지적했습니다 . 4 년 후 누락 된 것을 발견하고 추가 한 다음 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>
답변
여러 요소 애니메이션 완료를위한 단일 콜백을 얻으려면 지연된 객체를 사용하십시오.
$(".myClass").animate({
marginLeft: "30em"
}).promise().done(function(){
alert("Done animating");
});
Promise 및 Deferred Objects에 대한 자세한 설명은 jQuery API를 참조하십시오 .