2017-01-23 4 views
2

Adobe Animate CC 및 이클립스가 사용하는 Javascript 프레임 워크 인 EaselJS/CreateJS에 문제가 있습니다. 이벤트 리스너를 w/o 문제없이 추가 할 수는 있지만 제거 할 수는 없습니다. JS removeEventListener 핸들러를 실행하는 것을 포함하여 디버거에서 여러 가지 작업을 시도했습니다. 두 변수가 동일하게 보일지라도 짝수 리스너가 제거되지 않도록 절대로 == (또는 ===) 적이 아닙니다. 여기 Animate/EaselJS - removeEventListener가 작동하지 않습니다.

내가 사용하는 코드이며, 목적의 IT가 페이드 인하는 요소 위에 마우스를 할 때 :

그래서
this.fadeIn = function(target_mc) 
    { 
     target_mc.alpha = 0; 
     target_mc.visible = true; 

     target_mc.removeEventListener("tick",fadeIn_onEnterFrame); 
     target_mc.addEventListener("tick",fadeIn_onEnterFrame.bind(this)); 

     function fadeIn_onEnterFrame(evt) 
     { 
      evt.currentTarget.alpha = evt.currentTarget.alpha + .2; 
      if (evt.currentTarget.alpha >= 1) 
      { 
       evt.currentTarget.removeEventListener("tick",fadeIn_onEnterFrame); 
      } // end if 
     } 
    } // End of the function 

당신이이 frame_0의 캔버스에 추가됩니다 알고에서 호출 는 "마우스 오버"리스너는 각 의류 유형 (이, 드래그 앤 드롭 드레스 - 업 게임 FWIW의)

function clothing_onRollOver() 
{ 
    this.hint_mc.desc_mc.desc1_txt.text = this.articleName; 
    this.fadeIn(this.hint_mc); 
    this.clothingOver = true; 
}; 
clothing.addEventListener("mouseover",clothing_onRollOver.bind(this)); 
+0

'target_mc.removeEventListener ("tick", fadeIn_onEnterFrame); 또는 ... evt.currentTarget.removeEventListener ("tick", fadeIn_onEnterFrame); 또는 둘 다에 오류가 있습니까? – Zze

+0

나는 "both"와 함께 갈 것입니다 - 어느 쪽도 효과가없는 것처럼 보입니다. – HungryBeagle

답변

2

이 코드 일부 범위 지정 문제가 될 것 같습니다에 추가됩니다. 아래의 스 니펫은 문제를 해결하고 이벤트 리스너를 올바르게 제거하지만 현재 구현이 올바르게 작동하지 않는 이유는 알 수 없습니다.

차이

내가 .bind()이 문제를 일으키는 이유에 대해 확실하지 오전하지만 target_mc.addEventListener("tick",fadeIn_onEnterFrame.bind(this));

에서 바인딩을 제거했다는 것이다.

stage.enableMouseOver(); 

clothingOver = false; 

this.hint_mc.visible = false; 

this.fadeIn = function(target_mc) 
{ 
    console.log(target_mc); 

    target_mc.alpha = 0; 
    target_mc.visible = true; 

    target_mc.removeEventListener("tick",fadeIn_onEnterFrame); 
    target_mc.addEventListener("tick",fadeIn_onEnterFrame); 

    function fadeIn_onEnterFrame(evt) 
    { 
     console.log("tick"); 
     evt.currentTarget.alpha = evt.currentTarget.alpha + .2; 

     if (evt.currentTarget.alpha >= 1) 
     { 
      evt.currentTarget.removeEventListener("tick", fadeIn_onEnterFrame); 
     } // end if 
    } 
} // End of the function 



function clothing_onRollOver() 
{ 
    //this.hint_mc.desc_mc.desc1_txt.text = this.articleName; 
    this.fadeIn(this.hint_mc); 
    this.clothingOver = true; 
}; 


this.clothing.addEventListener("mouseover",clothing_onRollOver.bind(this)); 

죄송합니다. 귀하의 정확한 근본 원인을 파악할 수 없습니다.

+0

사실, 당신은 그것을 알았습니다 - 나는 addEventListener에서 ".bind (this)"를 제거하고 제대로 제거 할 수있었습니다. 나는 또한 모든 추가/제거 호출에 ".bind (this)"를 추가하려고 시도했으나 작동하지 않는다는 점에 유의해야합니다. 당신의 도움을 주셔서 감사합니다! – HungryBeagle

+1

이 이유는'bind'가 매번 새로운 함수를 생성하기 때문입니다. 'bind'의 값을 저장하지 않았다면 나중에 제거 할 수 있습니다 :'this.fn = fadeIn_onEnterFrame.bind(); btn.addEventListenen ("tick", fn); btn.removeEventListener ("tick", fn);'바인딩은 'this'범위를 유지하려는 경우에 유용합니다. – Lanny

+0

Thanks @ Lanny - Zze의 변경 사항을 구현 한 후 설명을 간단히 검색했지만 아무 것도 찾을 수 없었습니다. – HungryBeagle