2012-01-30 4 views
2

나는 이벤트 수신기를 추가하고 이벤트를 등록하는 다음 함수를 작성했습니다. this.$target 대상 요소의 요소 id를 보유하고 있다고 가정 (예를 들어 우리가 divid = 'myDiv'있는에 이벤트 리스너를 추가하는 경우, 다음 this.$target 될 것 myDiv) 및 (예를 들어 this.$_=document.getElementById('myDiv')) 대상 요소에 this.$_removeEventListener가 제대로 작동하지 않습니다.

이벤트 다음과 같은 방법으로 등록됩니다 ... 요소에 대한 이벤트 리스너의 각 유형에 대한 배열이 있습니다. 예 : myDiv_clickid = myDiv...SllymyDiv_mouseover의 div에있는 모든 클릭 이벤트 리스너를 보유하며 요소의 모든 마우스 오버 이벤트 핸들러를 보유합니다. 각 이벤트에 해당하는 이벤트에 대해 id 이벤트가 반환됩니다. 예를 들어 어떤 형태 eventType_indexInTheArray에 .. : 요소의 첫 번째 마우스 클릭 이벤트는

지금 나는의 EventListener를 제거하는 기능을 쓴 ... 이벤트 ID click_0

이 잘 작동이됩니다. 이 함수는 $hear()에 의해 반환 된 eventId을 인수로 취합니다 ... 그러나 그것을 실행 한 후에 이벤트는 삭제되지 않습니다 .. 함수는 아래에 주어져 있습니다 .. 그 안에있는 버그는 무엇입니까?

main.prototype.$hear = function(ev,callbackF,order) 
    { 

      if(typeof order == 'undefined' || order =='') 
      order = 0; 


      order = (order == 1)?true:false; 
      var a; 

      if(!(a = (this[this.$target+ev])))//event registration 
      a = ((this[this.$target+ev]) = new Array()); 

      a.push(callbackF+"_"+order); 
      this.$_.addEventListener(ev,callbackF,order); 
      return ev+"_"+(a.length - 1);//event Id 
    } 


    main.prototype.$miss = function(evId) 
     { 
      var ev = evId.split("_"); 
      var evIndex = ev[1]; 
      ev = ev[0]; 
      evId = ev; 
      if((!(ev = (this[this.$target+ev]))) || ev.length-1<evIndex||evIndex<0) 
      { 

       alert("ERROR \n\n\n Event having event id "+evId+" is not registered\n"); 
       return false; 
      } 
      else 
      { 
       var temp = evIndex; 
       evIndex = ev[evIndex].split("_") ; 

       this.$_.removeEventListener(evId,evIndex[0],evIndex[1]); 
       ev.splice(temp,1); 
      }    
    } 

답변

2

당신은 EventListener에 똑같이 removeEventListener에 동일한 인수를 전달해야합니다. 따라서 적절한 callbackForder.

그렇게하지 않으려 고합니다.

당신은 아마 대신

evIndex = ev[evIndex].split("_"); 

evIndex = a[evIndex].split("_"); 

을 의미하고 세계로 a을 원했다.

그러나 여전히 문제는 원래 FunctionString에서 다시 보내고 싶다는 것입니다.

코드를 다시 생각하고 다시 디자인해야합니다.

는 간단히 밀어 :

{ 
    'event_name' : ev, 
    'callback' : callbackF, 
    'order' : order 
} 

대신 연결된 문자열의 a에.

+1

좋은 아이디어!덕분에 –

1

마치 evIndex[0]은 제거하려는 기능에 대한 참조 대신 removeEventListener에 보내는 문자열입니다.

this.$_.removeEventListener(evId,callbackF,evIndex[1]);

내가 문자열 evIndex [0] 함수의 이름을 포함 실현,하지만 그것을 실제 참조를 removeEventListener 필요 단지 이름 :

난 당신이 뭔가를 필요가 있다고 생각 문자열에.

+0

대신 a.push (callbackF + "_"+ order); a.push (callbackF) a.push (주문) 이며 $ miss에 해당하는 retreival이면 충분합니까? –

+1

@JinuJD 필요한 모든 데이터가 포함 된 푸시 개체가 더 좋습니다. 내 대답을 참조하십시오. – Krizz

+2

그래, 그게 효과가 있지만 편집 @ Krizz 자신의 대답에 만든 더 좋은 솔루션입니다. – Howard

0
function scaleTwo(influenceEvent){ 
    var slideshow=document.getElementById("step3");   
    if(influenceEvent){ 
     if (slideshow.attachEvent){  
      slideshow.attachEvent("on"+mousewheelevt, rotateimage) 
     } else if (slideshow.addEventListener) { 
      slideshow.addEventListener(mousewheelevt, rotateimage, false) 
     } 
    } else{ 
     if (slideshow.attachEvent) { 
      slideshow.detachEvent("on"+mousewheelevt, rotateimage); 
     } else if (slideshow.addEventListener) { 
      slideshow.removeEventListener(mousewheelevt, rotateimage, false); 
     } 
    }       
} 

var influenceEvent = 0; 

$(window).scroll(function(event){ 

    if (($(document).scrollTop() > $('#step1').height()*2) && $(document).scrollTop() < $('#step1').height()*3) { 

     if(flagScrollTwo) { 
      scaleTwo(1); 
      influenceEvent = 1; 
     } 
     flagScrollTwo = 0;        
    } 

    if (($(document).scrollTop() > $('#step1').height()*3) || $(document).scrollTop() < $('#step1').height()*2) { 

     if(influenceEvent){ 
      scaleTwo(0); 
      influenceEvent = 0; 
     } 
    } 
} 
+0

다음 번에 코드를 설명하십시오. –