Javascript removeEventListener未在';按键向下';事件

Javascript removeEventListener未在';按键向下';事件,javascript,textbox,addeventlistener,Javascript,Textbox,Addeventlistener,我有一个仪表板站点,用户可以通过按站点窗口中任意位置的“l”或“g”热键在列表视图或网格视图之间切换。由于此eventListener在整个窗口的“keydown”事件中被调用,因此,如果用户在网站上的搜索文本框中键入“l”或“g”,则会导致网站切换视图的问题 为了缓解这个问题,我的方法是在搜索文本框元素中为“keydown”元素添加一个eventListener,从而删除window元素中“keydown”的eventListener。然后,我实现了一个计时器,在用户停止键入后开始倒计时3秒(

我有一个仪表板站点,用户可以通过按站点窗口中任意位置的“l”或“g”热键在列表视图或网格视图之间切换。由于此eventListener在整个窗口的“keydown”事件中被调用,因此,如果用户在网站上的搜索文本框中键入“l”或“g”,则会导致网站切换视图的问题

为了缓解这个问题,我的方法是在搜索文本框元素中为“keydown”元素添加一个eventListener,从而删除window元素中“keydown”的eventListener。然后,我实现了一个计时器,在用户停止键入后开始倒计时3秒(通过在“keyup”事件的搜索文本框中添加eventListener)

在搜索文本框上没有触发“keydown”事件的3秒钟之后,我再次将“keydown”eventListener添加回window元素

JS代码

let定时器;
设时间间隔=3000;//毫秒等于3秒
让searchTextBox=document.querySelector(#searchTextBox”);
if(typeof(searchTextBox)!=“undefined”&&searchTextBox!=null){//检查搜索文本框是否已成功创建并插入到DOM中
searchTextBox.addEventListener('keydown',function(){//当按下搜索文本框上的键时,删除窗口eventListener
removeEventListener('keydown',addview热键);
});
searchTextBox.addEventListener('keyup',function(){//在释放键后启动计时器
控制台日志(“钥匙被提起”);
clearTimeout(计时器);//如果已设置超时,则清除超时
如果(searchTextBox.value){//如果文本框中有任何输入,请设置计时器以在时间间隔毫秒后执行finishedTyping函数
计时器=设置超时(完成键入,时间间隔);
}
});
函数finishedTyping(){
addViewHotKeys();
console.log('times up');
}
}
//检测热键,以便在index.html上轻松导航
函数addViewHotKeys(){
window.addEventListener('keydown',函数(事件){
如果(event.key=='l'){
如果(state.display!=='list'){
state.display='list';
renderViewSelection();
renderDashboardPlane();
}
}else if(event.key=='g'){
如果(state.display!=='grid'){
state.display='grid';
renderViewSelection();
renderDashboardPlane();
}
}
});
}
window.addEventListener('load',函数(){
addViewHotKeys();
});

搜索文本框上的“keydown”和“keyup”事件监听器成功触发(计时器在3秒后执行finishedTyping函数,按预期工作)。但是,对于搜索框上的“keydown”eventListener,它没有删除window元素上的eventListener,我仍然找不到出现这种情况的原因。

解决此问题的更干净的方法可能是使用搜索文本框和事件,而不是在键输入上使用计时器

下面的示例在关注输入元素时删除keydown事件侦听器,并在输入元素失去焦点时再次添加它。您可以应用相同的技术来包括任何其他输入元素

let searchTextBox=document.querySelector(“#search textbox”);
//检测热键,以便在index.html上轻松导航
函数addViewHotKeys(事件){
如果(event.key=='l'){
console.log('l');
//这里有有用的代码
}else if(event.key=='g'){
console.log('g');
//这里有有用的代码
}
}
window.addEventListener('load',函数(){
searchTextBox.addEventListener('focus',function(){
removeEventListener('keydown',addview热键);
});
searchTextBox.addEventListener('blur',function(){
window.addEventListener('keydown',addViewHotKeys);
});
window.addEventListener('keydown',addViewHotKeys);
});
按l或g键将该字母记录到控制台,除非输入具有焦点: