removeEventListener не работает должным образом - PullRequest
2 голосов
/ 30 января 2012

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

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

Это отлично работает ...

Теперь я написал функцию для удаления обработчика событий. Функция принимает 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);
            }               
    }

Ответы [ 3 ]

2 голосов
/ 30 января 2012

Вам нужно передать точно такие же аргументы removeEventListener, как EventListener. Таким образом, адекватные callbackF и order.

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

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

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

вместо

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

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

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

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

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

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

в a вместо вашей объединенной строки.

1 голос
/ 30 января 2012

Похоже, evIndex[0] - это строка, которую вы отправляете в removeEventListener вместо ссылки на функцию, которую хотите удалить.

Я думаю, вам нужно что-то вроде этого:

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

Я понимаю, что строка evIndex [0] содержит имя функции, но removeEventListener нужна фактическая ссылка на нее, а не только ее имя в строке.

0 голосов
/ 15 июня 2012
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;
        } 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...