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
bindskeyUp
。点击空格键执行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
bindskeyUp
。点击空格键执行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