Javascript removeEventListener无法正常工作

Javascript removeEventListener无法正常工作,javascript,javascript-events,addeventlistener,Javascript,Javascript Events,Addeventlistener,我已经编写了以下函数,它添加了一个事件侦听器并注册了事件。假设this.$target保存目标元素的元素id(例如:如果我们在div上添加事件侦听器,并且id='myDiv',那么this.$target将是myDiv)和this.$指向目标元素(例如:this.$\ux=document.getElementById('myDiv')) 事件以以下方式注册。。。 元素的每种类型的事件侦听器都有一个数组。例如:myDiv\u click将在具有id=myDiv…的div上保留所有click事件侦

我已经编写了以下函数,它添加了一个事件侦听器并注册了事件。假设
this.$target
保存目标元素的元素
id
(例如:如果我们在
div
上添加事件侦听器,并且
id='myDiv'
,那么
this.$target
将是myDiv)和
this.$
指向目标元素(例如:
this.$\ux=document.getElementById('myDiv')

事件以以下方式注册。。。 元素的每种类型的事件侦听器都有一个数组。例如:
myDiv\u click
将在具有
id=myDiv…的div上保留所有click事件侦听器。几乎
myDiv\u mouseover
将在元素的事件处理程序上保留所有鼠标。对应于每个事件,函数返回一个事件
id
。其格式为数组中的
eventType\u
。。例如:元素上的第一次鼠标单击事件将具有事件id
click\u 0

这个很好用

现在,我编写了一个用于删除eventlistener的函数。函数将
$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);
            }               
    }
main.prototype.$hear=function(ev、callback、order)
{
如果(订单类型=='未定义'| |订单=='')
顺序=0;
顺序=(顺序==1)?真:假;
var a;
if(!(a=(this[this.$target+ev])//事件注册
a=((this[this.$target+ev])=新数组();
a、 推送(回拨+命令);
此.$\添加了EventListener(ev、Callback、order);
返回ev+“”+(a.length-1);//事件Id
}
main.prototype.$miss=function(evId)
{
var ev=期初拆分(“”);
var evIndex=ev[1];
ev=ev[0];
evId=ev;

如果(!(ev=(this[this.$target+ev]))| ev.length-1您需要将完全相同的参数传递给
removeEventListener
就像
EventListener
一样。这样就足够了
callback
order

你没有这样做

你可能是说

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

evIndex = ev[evIndex].split("_");
并希望
a
成为全球性的

但问题仍然是,您希望从
字符串
获取原始的
函数

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

只需推送:

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

进入
a
而不是连接的字符串。

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

我想你需要这样的东西:

this.$\u.removeEventListener(evId、callbackF、evIndex[1]);

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

函数scalewo(影响事件){
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;
        } 
    }
}
var slideshow=document.getElementById(“step3”); 如果(影响事件){ if(slideshow.attachEvent){ 幻灯片。附件(“在”+鼠标滚轮上,旋转图像) }else if(幻灯片放映。addEventListener){ 幻灯片放映。添加视频列表(mousewheelevt、rotateimage、false) } }否则{ 如果(幻灯片,附件){ slideshow.detachEvent(“在”+mousewheelevt上,旋转图像); }else if(幻灯片放映。addEventListener){ slideshow.removeEventListener(mousewheelevt,rotateimage,false); } } } var-influenceEvent=0; $(窗口)。滚动(功能(事件){ 如果($(文档).scrollTop()>$('#step1').height()*2)和&$(文档).scrollTop()<$('#step1').height()*3){ 如果(两个){ scalewo(1); 影响事件=1; } 2=0; } 如果($(文档).scrollTop()>$('#step1').height()*3)| |$(文档).scrollTop()<$('#step1').height()*2){ 如果(影响事件){ scalewo(0); 影响事件=0; } } }
a.push(callbackF+“”+order)与a.push(callbackF)相比,a.push(callbackF)与$miss中相应的retreval足够了吗?@JinuJD更好地推送包含所有所需数据的对象,请参阅我的答案。是的,这样做可以,但是@Krizz对他们的答案进行编辑是一个更好的解决方案。