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