2012-01-30 4 views
2

Я написал следующую функцию, которая добавляет слушателя событий и регистрирует событие. Предположим, что this.$target удерживает элемент id целевого элемента (напр: если мы добавим слушателя событий на div имея id = 'myDiv', то this.$target будет myDiv) и this.$_ указывает на целевой элемент (для ех: this.$_=document.getElementById('myDiv'))removeEventListener не работает должным образом

Событие регистрируется следующим образом ... Для каждого типа прослушивателей событий для каждого элемента существует массив. Например: myDiv_click проведет все прослушиватели событий по событию на div, имеющем id = myDiv...Slly. myDiv_mouseover будет удерживать все мыши над обработчиками событий элемента. Соответствуя каждому событию, функция id возвращается функцией. Который в виде eventType_indexInTheArray .. Для экс: первое событие мыши на элемент будет иметь идентификатор события click_0

Это прекрасно работает ...

Теперь я написал функцию для удаления EventListener. Функция принимает eventId, возвращенный $hear() в качестве аргумента ... Но после его выполнения событие не удаляется. Функция дается ниже. Что это за ошибка?

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. Таким образом, адекватные callbackF и order.

Вы этого не делаете.

Вы, вероятно, имел в виду

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

вместо

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

и хотел a быть глобальным.

Но все же проблема в том, что вы хотите получить свой оригинал Function с String.

Вам необходимо переосмыслить и переделать код.

Просто нажмите:

{ 
    '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 (заказ) и соответствующий retreival в $ miss достаточно? –

+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

В следующий раз, пожалуйста, объясните свой код. –