2010-05-24 2 views
6

jQuery에서 애니메이션을 적용 할 때 각 요소가 아닌 모든 요소가 애니메이션 처리되는 경우에만 콜백을 시작하는 것이 가장 좋습니다. 예를 들어애니메이션을 적용 할 때 모든 요소가 완료 될 때만 콜백을 시작하는 방법은 무엇입니까?

:

$('.someElements').fadeOut('fast', function() { 
    // dont do this until ALL elements are done fading 
} 
+0

질문에 혼란이 있습니까? 모든 요소는 동시에 애니메이션을 끝내야합니다. 그들은 모두 '빠름'의 지속 시간을 얻습니다. 그래서 그들은 모두 동시에 끝납니다. – Tejs

+0

콜백을 한 번만 ** ** 한 번만 시작 하시겠습니까? –

+0

Tejs : Justin이 아래에서 언급했듯이 컬렉션의 각 요소에 대해 콜백이 실행됩니다. 그리고 Felix, 예, 단 한번 콜백을 시작하고 싶습니다. 아래의 microspino의 대답과 함께 가기로 결심했습니다. –

답변

4

이 시도하는 코드 조각이 될 수 ... 당신이해야 할 어떤 않는 콜백에 특수 코드를 가질 수 있습니다 콜백해야 해.

EDIT (다른 방법) :

또한 모든 요소가 아니라 마지막 하나를 잡을 수 있습니다.

$('.someElements').not(.someElements:last).fadeOut(); 

다음은이에 콜백

$('.someElements:last').fadeOut(fast, function(){ 
    // do something, it's the end of the world 
}; 
+1

좋아요! 그러나 비교가 참이되게하려면 조건은 (--numberOfElements> 0)이어야합니다. 비교하기 전에 변수를 감소시킵니다. –

+0

- LeftHandSideExp 연산자입니다.먼저 표현이 감소한 다음 비교가 평가됩니다. 마지막 루프에 있다고 가정 해 봅시다 : 요소가 1 개있는 경우 표현식은 다음과 같이됩니다. 1--> 0? 거짓, 반환하지 말고 다음 행으로 이동하여 경고 호출을 시작하십시오. – microspino

+1

이 작업을 수행하려면 조건은 (--numberOfElements> 0)이어야합니다. – aghoshx

2

이에 따라, 좋은 질문입니다 jQuery docs :

여러 요소가 애니메이션되는 경우, 일치 당 콜백이 한 번 실행되는 것이 중요합니다 요소가 아니라 전체 애니메이션을 위해 한 번.

당신이 할 수이 문제를 해결하려면 다음

  • 열거 .someElements 일치하는 모든 요소, 그리고 각각에 대해 별도의 콜백을 설정합니다.
  • 총 콜백 수를 추적하는 변수가 count입니다. 카운트가 0에 도달하면이 0

에 도달 할 때까지 콜백에서

  • 모든 콜백이 완료되면 count을 감소, 당신은 모든 요소가 애니메이션 완료 보장됩니다.

    var numberOfElements = $('.someElements').length; 
    
    $('.someElements').fadeOut(fast, function() { 
        if(numberOfElements-- > 0) return; 
        alert('call the Fireman!'); 
    }); 
    

    을 경고는 말에 바로 자리 표시 자입니다 : 여기에서, 당신은 다음

  • +0

    감사합니다 저스틴! 콜백이 한 번 실행되기를 원한다면 약간 정교 해 보이지만, 각 애니메이션에 대해서도 무언가가 필요할 때 유용합니다. 이 단순한 경우 나는 microspino의 답변으로 갈 것입니다. –

    0

    최근의 jQuery를 릴리스 (버전 1.6 이상)는 promise의 아이디어를 포함을하는 페이드를 추가합니다. 이 함수를 사용하면 해결 방법이 필요하지 않습니다. 예 :

    // define the animation on many elements 
    $('.someElements').fadeOut('fast'); 
    
    // define the promise that is called once all element animations are done 
    $('.someElements').promise().done(function() { 
        // put callback actions here 
    }); 
    
    관련 문제