Javascript 为什么使用“removeEventListener”的代码似乎无法正确解除键事件的绑定? 我期望我的代码做什么

Javascript 为什么使用“removeEventListener”的代码似乎无法正确解除键事件的绑定? 我期望我的代码做什么,javascript,html,removeeventlistener,Javascript,Html,Removeeventlistener,当我单击第一个按钮,然后按空格键时,它应该会提醒“hello world”。当我单击第二个按钮,然后按空格键时,我希望它会提示“hello”。对第三个按钮重复此操作,它会提醒“hello3” 代码的当前结果是什么 当我单击第一个按钮时,它会工作:它会提醒“hello world”。但问题是当我单击第二个或第三个按钮时:它仍然会提醒“hello world” 我的代码有什么问题 函数usekeyUp(){ 文件。添加的文件列表(“键控”,键控); } 功能键控(事件){ 文件。删除VentLis

当我单击第一个按钮,然后按空格键时,它应该会提醒
“hello world”
。当我单击第二个按钮,然后按空格键时,我希望它会提示
“hello”
。对第三个按钮重复此操作,它会提醒
“hello3”

代码的当前结果是什么 当我单击第一个按钮时,它会工作:它会提醒“hello world”。但问题是当我单击第二个或第三个按钮时:它仍然会提醒“hello world”

我的代码有什么问题

函数usekeyUp(){
文件。添加的文件列表(“键控”,键控);
}
功能键控(事件){
文件。删除VentListener(“keyup”,keyUp2);
文件。删除VentListener(“keyup”,keyUp3);
如果(event.code==='Space'){
警报(“你好,世界”)
}
}
函数usekeyUp2(){
文件。添加的文件列表(“keyup”,keyUp2);
}
函数keyUp2(事件){
文件。删除VentListener(“keyup”,keyup);
文件。删除VentListener(“keyup”,keyUp3);
如果(event.code==='Space'){
警报(“你好”)
}
}
函数usekeyUp3(){
文件。添加的文件列表(“keyup”,keyUp3);
}
函数keyUp3(事件){
文件。删除VentListener(“keyup”,keyup);
文件。删除VentListener(“keyup”,keyUp2);
如果(event.code==='Space'){
警报(“hello3”)
}
}
点击
点击
单击
当前,当您单击空格键时,所有事件侦听器仍处于绑定状态(通过单击按钮),并且每个回调都按顺序执行。如果按下第一个按钮,
usekeyUp
binds
keyUp
。点击空格键执行
keyUp
,取消绑定
keyUp2
keyUp3
并发出警报
“hello world”
。它不会解除绑定
keyUp

如果随后单击另一个按钮,例如第二个按钮,则它会额外绑定
keyUp2
。但是如果点击空格键,当前绑定的事件侦听器依次为
keyUp
keyUp2
。首先,执行
keyUp
,解除绑定
keyUp2
keyUp3
。现在,没有其他事件侦听器被绑定,但
keyUp
将永远保持绑定状态

下面是关于此行为的说明:

如果EventListener在处理事件时从EventTarget中删除,则当前操作不会触发它。删除EventListener后,将不会为其注册的事件调用EventListener。但是,它可以重新连接

因此,
removeEventListener
s“工作”,但始终无法找到正确的

如果要继续使用
removeEventListener
,请将
removeEventListener
行移动到相应的
单击事件中,而不是
keyup
事件中

onclick
这样的内联事件处理程序是可用的。它们是记录事件的一种方式。总是这样

document.getElementById(“click1”).addEventListener(“click”,函数(){
文件。添加的文件列表(“键控”,键控1);
文件。删除VentListener(“keyup”,keyUp2);
文件。删除VentListener(“keyup”,keyUp3);
});
document.getElementById(“click2”).addEventListener(“click”,函数)(){
文件。删除VentListener(“keyup”,keyUp1);
文件。添加的文件列表(“keyup”,keyUp2);
文件。删除VentListener(“keyup”,keyUp3);
});
document.getElementById(“click3”).addEventListener(“click”,函数(){
文件。删除VentListener(“keyup”,keyUp1);
文件。删除VentListener(“keyup”,keyUp2);
文件。添加的文件列表(“keyup”,keyUp3);
});
函数keyUp1(事件){
如果(event.code==“Space”){
警报(“你好,世界”)
}
}
函数keyUp2(事件){
如果(event.code==“Space”){
警报(“你好”)
}
}
函数keyUp3(事件){
如果(event.code==“Space”){
警报(“hello3”)
}
}

当前,当您点击空格键时,所有事件侦听器仍处于绑定状态(通过单击按钮),并且每个回调都按顺序执行。如果按下第一个按钮,
usekeyUp
binds
keyUp
。点击空格键执行
keyUp
,取消绑定
keyUp2
keyUp3
并发出警报
“hello world”
。它不会解除绑定
keyUp

如果您然后单击另一个按钮,例如第二个按钮,则它会附加绑定
keyUp2
。但是如果点击空格键,当前绑定的事件侦听器依次为
keyUp
keyUp2
。首先,执行
keyUp
,解除绑定
keyUp2
keyUp3
。现在,没有其他事件侦听器被绑定,但
keyUp
将永远保持绑定状态

下面是关于此行为的说明:

如果EventListener在处理事件时从EventTarget中删除,则当前操作不会触发它。删除EventListener后,将不会为其注册的事件调用EventListener。但是,它可以重新连接

因此,
removeEventListener
s“工作”,但始终无法找到正确的

如果要继续使用
removeEventListener
,请将
removeEventListener
行移动到相应的
单击事件中,而不是
keyup
事件中

onclick
这样的内联事件处理程序是可用的。它们是记录事件的一种方式。总是这样

document.getElementById(“click1”).addEventListener(“click”,函数(){
文件。添加的文件列表(“键控”,键控1);
文件。删除VentListener(“keyup”,keyUp2);
文件。删除VentListener(“keyup”,keyUp3);
});
document.getElementById(“click2”).addEventListener(“click”,函数)(){
文件。删除VentListener(“keyup”,keyUp1);
文件。添加的文件列表(“keyup”,keyUp2);
文件。删除VentListener(“keyup”,keyUp3);
});
document.getElementById(“click3”).addEventLi