2013-08-29 3 views
0

심지어이 쳐다 보면서이 솔루션은 여전히 ​​나에게 도움이되지 않았다 : Execute a function after X seconds in jquery 여기의 setTimeout 함수를 실행하지 않습니다

내 코드입니다 :

// featured bounce 
$('#featured .animated').hover(function() { 
    $(this).addClass('bounce'); 
    setTimeout(function(){ 
     $(this).removeClass('bounce');}, 
     1300 
    ); 
}); 

는 클래스 작품의 추가하지만, setTimeout 시련은 작동하지 않습니다. 실행되지도 않고 자바 스크립트 오류가 Chrome 콘솔에 표시되지 않습니다.

"애니메이션 바운스"

그리고 애니메이션이 재생하지만, 그때는 제거하지 마십시오 : 나는 모든 것이 올바르게 입력해야 같은 느낌 있습니다 .. addClass() 후 .animated 개체의 클래스는 다음과 같습니다 클래스 속성에서 "바운스".

어떤 도움이 필요합니까?

+0

타이머의 "this"문맥에는 참조가 없습니다. 이것을 타이머 기능에 전달해야합니다. –

답변

1

범위가 예상되는 요소가 아닌 창을 가리키고 있습니다.

$('#featured .animated').hover(function() { 
    var elem = $(this); 
    elem.addClass('bounce'); 
    setTimeout(function(){ 
     elem.removeClass('bounce');}, 
     1300 
    ); 
}); 
+0

예, 내가 흉내 낸 사이트는이 animatejs 스크립트의 제작자였습니다. 그리고 그는 그 방식으로도 그렇게했습니다 : http://daneden.me/animate/ 어떻게하면됩니까? – Peanut

-2
$('#featured .animated').hover(function() { 
    $(this).addClass('bounce'); 
    (function(that) { 
     setTimeout(function(){ 
      // use `that` instead of `this` 
      $(that).removeClass('bounce'); 
     }, 1300); 
    })(this); //pass `this` into this function 
}); 
+0

나는 어떤 질문도하지 않았다. – Neal

+1

그는 당신의 대답을 의미했습니다. 코드 전용 답변은 거의 도움이되지 않습니다. –

+0

Yikes. 이것은 setTimeout의 컨텍스트를 관리하는 중괄호입니다. – naomik

3

제대로 Function.prototype.bind를 사용하면 싼 상황이 var that = this 같은 해킹 방지 할 수 있습니다.

// featured bounce 
$('#featured .animated').hover(function() { 
    var elem = $(this); 
    elem.addClass('bounce'); 
    setTimeout(elem.removeClass.bind(elem, 'bounce'), 1300); 
}); 

사이드 노트 : Function.prototype.bind는 ES5 추가 기능이며 브라우저 지원을 고려해야합니다. 이 기능에 대한 MDN 기사 하단의 호환성 표를 참조하십시오.

+0

+1 아주 멋진 솔루션입니다. 너의 것이 더 간단하기 때문에 나는 나의 것을 삭제했다. – Itay

+0

@naomik 당신은 당신의 솔루션처럼 멋지게 보입니다. :) – zsong

+0

'#sza {tact : none; } – Itay

관련 문제