2012-01-30 70 views
2

我寫了下面的函數,它添加了一個事件監聽器並註冊了這個事件。假設this.$target持有目標元素的元素id(爲前:如果我們在具有id = 'myDiv'div添加事件偵聽器,然後this.$target會myDiv)和this.$_指向目標元素(例如:this.$_=document.getElementById('myDiv')removeEventListener無法正常工作

事件按照以下方式註冊... 對於元素的每種類型的事件偵聽器都有一個數組。例如:myDiv_click將在div上保留所有點擊事件監聽器,其中id = myDiv...SllymyDiv_mouseover將把所有鼠標懸停在元素的事件處理程序上。對應於每個事件,函數返回事件id。這是在形式eventType_indexInTheArray。對於例如:一個元素上的第一個鼠標點擊事件將有一個事件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

您需要準確傳遞相同的參數removeEventListener喜歡EventListener。因此足夠的callbackForder

你沒有這樣做。

你可能是指

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

代替

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

,並希望a是全球性的。

但問題仍然是你想從String回到原來的Function

您需要重新考慮並重新設計您的代碼。

您只要按:

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

a,而不是你的連接字符串。

+1

它的一個好主意!謝謝 – 2012-01-30 18:15:49

1

它看起來像evIndex[0]是一個字符串,您將發送到removeEventListener而不是您要刪除的函數的引用。

我想你需要的東西是這樣的:

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

我意識到串evIndex [0]包含了函數的名字,但removeEventListener需要給它一個實際的參考,而不只是它的名字在一個字符串中。

+0

所以,而不是a.push(callbackF +「_」+順序);是a.push(callbackF) a.push(order) 和$ miss中相應的retreival就夠了嗎? – 2012-01-30 17:59:39

+1

@JinuJD更好地推送包含所有需要的數據的對象,請參閱我的答案。 – Krizz 2012-01-30 18:02:13

+2

是的,這將工作,但編輯@Krizz對他們的答案是一個更好的解決方案。 – Howard 2012-01-30 18:05:00

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

下次請解釋你的代碼。 – 2012-10-21 08:24:18