Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript自定义eventlistener不工作?_Javascript - Fatal编程技术网

Javascript自定义eventlistener不工作?

Javascript自定义eventlistener不工作?,javascript,Javascript,这些是自定义事件侦听器中不起作用的代码部分 当它们相同时,为什么返回“-1”var idx=functionList[eventType].indexOfcallback 当我在myObject.removeCustomEventListenr方法中使用以下内容时 两者都是一样的,为什么不起作用呢 下面是导致故障的完整部分 var myObject = {} var functionList = {} myObject.addCustomEventListener = function(eve

这些是自定义事件侦听器中不起作用的代码部分

当它们相同时,为什么返回“-1”var idx=functionList[eventType].indexOfcallback

当我在myObject.removeCustomEventListenr方法中使用以下内容时

两者都是一样的,为什么不起作用呢

下面是导致故障的完整部分

var myObject = {}
var functionList = {}

myObject.addCustomEventListener = function(eventType,callback){
    if(!functionList[eventType]){
        functionList[eventType] = []
    }
    functionList[eventType].push(callback)
    //creates functionList.start[0] = function(){console.log('firedEvent')}
}

myObject.removeCustomEventListener = function(eventType,callback){
    if(functionList[eventType]){
        var idx = functionList[eventType].indexOf(callback)
        console.log(idx) //logs '-1' should however match and return 0
        if(idx!=-1){
            functionList[eventType].splice(idx,1)
            console.log('removed')//obviously does not remove the function form the array
        }
    }
}

myObject.addCustomEventListener('start',function(){console.log('firedEvent')})
myObject.removeCustomEventListener('start',function(){console.log('firedEvent')})
请解释为什么会发生这种情况,以及我如何修复它


谢谢

问题在于您正在将对两个不同函数的引用传递到添加和删除函数,如下所示:

myObject.addCustomEventListener('start',function(){console.log('firedEvent')})
myObject.removeCustomEventListener('start',function(){console.log('firedEvent')})
虽然函数中的代码是相同的,但就JavaScript而言,它们都是独立的对象,这意味着您在将另一个传递给indexOf时找不到一个

这应该起作用:

var callback = function(){
    console.log('firedEvent')
};
myObject.addCustomEventListener('start', callback)
myObject.removeCustomEventListener('start', callback)
var myObject={} var functionList={} myObject.addCustomEventListener=函数事件类型,回调{ if!函数列表[eventType]{ 函数列表[eventType]=[] } 函数列表[eventType].pushcallback //创建functionList.start[0]=函数{console.log'firedEvent'} } myObject.removeCustomEventListener=函数事件类型,回调{ iffunctionList[eventType]{ var idx=functionList[eventType].indexOfcallback console.logidx//logs'-1'应匹配并返回0 ifidx!=-1{ 函数列表[eventType]。拼接IDX,1 警报'removed'//显然不会从数组中删除函数 } } } var callback=函数{ console.log'firedEvent' }; addCustomEventListener'start',回调;
removeCustomEventListener'start',回调;是的,两个对象函数也是对象,即使它们的内容完全相同,它们也永远不相等。好的,谢谢。在demoList{ifdemoList[x].toString==callback.toString{idx=x;break}}中的ifidx==-1{var demoList=functionList[eventType]forx下面添加以下内容可以吗@Kwiksilver:我不知道你想用这段代码实现什么……将数组中的所有“函数”转换成一个字符串,并将它们与callback.toString进行比较。基本上,将函数作为字符串进行比较,如果它们相等,则会将idx设置为数组中匹配的点。我的意思是在var idx=functionList[eventType].indexOfcallback下添加。@Kwiksilver:ifdemoList[x]==回调应该可以工作
var callback = function(){
    console.log('firedEvent')
};
myObject.addCustomEventListener('start', callback)
myObject.removeCustomEventListener('start', callback)