首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >removeEventListener不能正常工作

removeEventListener不能正常工作
EN

Stack Overflow用户
提问于 2012-01-31 01:42:23
回答 3查看 746关注 0票数 2

我已经编写了以下函数,用于添加事件侦听器并注册事件。假设this.$target包含目标元素的元素id (例如:如果我们在具有id = 'myDiv'div上添加事件侦听器,则this.$target将为myDiv),并且this.$_指向目标元素(例如:this.$_=document.getElementById('myDiv'))

该事件按以下方式注册...元素的每种类型的事件侦听器都有一个数组。例如:myDiv_click将持有div上的所有单击事件侦听器,让id = myDiv...Slly myDiv_mouseover将鼠标悬停在每个事件的element..Corresponding的事件处理程序上,该函数将返回一个事件id。其格式为eventType_indexInTheArray..对于ex:元素上的第一个鼠标单击事件将具有事件id click_0

这很好用..。

现在,我编写了一个删除eventlistener的函数。该函数将$hear()返回的eventId作为argument...But,执行后事件不是deleted..The,函数被赋予了below..What,是不是有bug?

代码语言:javascript
复制
   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);
            }               
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-31 01:54:44

您需要像传递给EventListener一样向removeEventListener传递完全相同的参数。因此有足够的callbackForder

你不会这么做的。

你的意思可能是

代码语言:javascript
复制
evIndex = a[evIndex].split("_");

而不是

代码语言:javascript
复制
evIndex = ev[evIndex].split("_");

并希望a是全球性的。

但问题仍然是,你想从String拿回你的原始Function

你需要重新思考和重新设计你的代码。

只需推送:

代码语言:javascript
复制
{ 
   'event_name' : ev,
   'callback' : callbackF,
   'order' : order
}

转换为a,而不是您的连接字符串。

票数 2
EN

Stack Overflow用户

发布于 2012-01-31 01:55:01

看起来evIndex[0]是您要发送给removeEventListener的字符串,而不是您想要删除的函数的引用。

我认为你需要这样的东西:

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

我意识到字符串evIndex包含函数的名称,但是removeEventListener需要一个对它的实际引用,而不仅仅是它在字符串中的名称。

票数 1
EN

Stack Overflow用户

发布于 2012-06-15 18:44:58

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9068255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档