2017-10-03 1 views
3

클릭 할 때 헤더 및 단락 태그의 글꼴을 전환해야하는 글꼴 테스트 페이지에서 작업하고 있습니다. 어느 잘 작동하지만 경험은 정말 다음과 같은 경로를 부드럽게하려면 너무 거슬리는된다페이드 아웃이 완료되기 전에 fadeOut() 콜백이 완료됩니다.

페이드 아웃 -> 폰트 스왑을 -

에> 페이드 그러나 코드는 글꼴을 실행 먼저 스왑 한 다음 애니메이션.

다음 코드 단편은 내 문제의 근본 원인이기 때문에 jQuery 만 포함합니다.

// Anytime a card is clicked 
$('.card').click(function(){ 
    // Call card by id and switch the fonts 
    var id = "#" + this.parentElement.id; 
    $(this).fadeOut(900,swapFont(id)); 
    $(this).fadeIn(500); 
    // attach the above to some sort of transition callback 

}); 

// Function to swap the font around so that the header is now the body font and the body font is now the header font 
function swapFont(id) { 
// font-swap logic in here which works fine 
} 

답변

3

, 대신 당신은 함수 자체를 가리 키도록해야합니다.

그래서이 :

$(this).fadeOut(900, function() { swapFont(id) }); 

편집 :

var x = swapFont(id); 
$(this).fadeOut(900, x); 

가장 쉬운 방법은 익명 함수를 래핑하는 것입니다 :

$(this).fadeOut(900,swapFont(id)); 

는 것과 동일합니다 :

fadeInfadeOut이 완료되기 전에 실행됩니다. .delay을 추가하거나 Rory의 대답에 따라 콜백에서 fadeIn (더 이상 설명하지 않겠습니다)을 호출 할 수 있습니다.

+0

을 참조하십시오. 나는 문자 그대로 방금 포장 방법을 사용했고, 답변을하고 돌아 왔지만 이미 게시했습니다. 나는 그것이 효과를 얻는다. 그런데 왜 작동합니까? jQuery가 함수를 콜백으로 인식하지 않기 때문입니까? – Callat

+1

함수의 결과를 전달하기 때문입니다. 함수 자체를 전달해야합니다. 그것은 가장 분명한 개념은 아니지만, 당신이 그것을 얻을 때 매우 강력합니다. '함수 포인터'라고 불리는데 사용되었지만 js에서는 '함수 변수'라고 불립니다. –

+0

아 ... 그래서 이름을 호출하면 반환 값을 가리키는 함수를 가리 키지 않습니다. 그래서 콜백에서 함수를 반환하려면 var를, 타입을 반환하려면 유령 함수가 필요합니다.그것은 많은 의미가 있습니다. 고맙습니다. – Callat

6

fadeOut() 애니메이션이 (비효율적으로) 비동기이기 때문에 문제가 발생했습니다. 이것은 애니메이션이 진행되는 동안 다음 문장이 평가된다는 것을 의미합니다. 따라서 당신이 보는 행동입니다. 이 문제를 해결하려면 fadeX() 메서드가 제공하는 콜백 패턴을 사용해야합니다.

또한 이벤트가 발생할 때 실행될 함수 참조 대신 swapFont()의 즉치 실행 결과를 콜백에 전달합니다. 이 시도 : 당신은 현재 swapFont() 호출의 결과를 전달하는

$('.card').click(function(){ 
    var id = "#" + this.parentElement.id; 
    $(this).fadeOut(900, function() { 
    swapFont(id); 
    $(this).fadeIn(500); 
    }); 
}); 
+1

이것은'swapFont()'의 결과를 전달하는 문제도 해결합니다 (그러나 언급하지는 않습니다). 편집 : –

+1

@ freedomn-m 이제 편집자가 주석을 달기 전에 편집을 할 수있었습니다 : D –

+1

'fadeX()'에 의해'fadeIn()','fadeOut()', fadeToggle() 메소드 등. 'fadeIn()'은 콜백 안에 있어야합니다 - 이것이이 대답의 요점입니다. fadeOut 애니메이션이 끝난 후 함수가 * 내부 *에서 발생합니다. –

관련 문제