Keydown事件未从文档中删除而未在div元素上注册

时间:2013-06-21 03:42:29

标签: javascript events javascript-events domdocument keydown

注意:找到了问题的原因,请在第一个答案中阅读评论。

我有一个下拉列表,在用户调用它之前一直隐藏。 就像这样

<div>
    <button></button>
    <ul>
        <li></li>
        ....
        <li></li>
    </ul>
</div>

基本理念:

当用户按下上面代码中显示的按钮时,该列表变为可见。

我需要让列表能够通过键盘导航,
即如果用户在列表打开时按下或按下,则会选择相应的li(就好像鼠标悬停在它上面一样)

当列表变得可见时,应附加负责将此功能提供给列表的事件侦听器,并在列表再次隐藏时删除。

类似于Bitbucket为下拉列表所做的事情,但更简单。

问题:

我试图将一个事件监听器附加到ul然后在div元素上,当前者没有效果时,无效。
代码是这个

ON SHOW

this.<ul or div element here>.addEventListener('keydown', this.keyboardNavigation.bind(this));

隐藏

this.<ul or div element here>.removeEventListener('keydown', this.keyboardNavigation.bind(this));

并且回调就像这样

function keyboardNavigation(e) {
    console.log('foo');
}

注意:“this”是div和ul都是其属性的对象,回调函数实际上是该对象的一个​​方法。

问题1:
当我将它连接到ul本身或父div时,为什么keydown事件不起作用?

无论如何,由于这些不起作用,我决定将听众附在文件上 ON SHOW

document.addEventListener('keydown', this.keyboardNavigation.bind(this));

隐藏

document.removeEventListener('keydown', this.keyboardNavigation.bind(this));

相同的回调。

现在,虽然这有效,但我注意到事件监听器没有从文档中删除 我后来注意到,另外一个keydown事件监听器我已经附加到另一个任务的文档,当该任务完成时也不会被删除,而它应该。

问题2:
为什么不删除事件侦听器?我无法理解我做错了什么,我正在删除与添加的事件完全相同的回调。

非常感谢任何帮助。

注意: 我尝试用jQuery的.on()和.off()代替,作为sugested here,虽然我不想使用jQuery,但同样的事情正在发生。

1 个答案:

答案 0 :(得分:2)

我的想法:

1是因为DIV或UL没有获得键盘事件,因为没有焦点?而文件总是得到冒泡的事件?

要对此进行测试,请单击DIV / UL并键入,然后查看是否触发了键盘事件。

我认为绑定到文档 - 如果您希望用户能够在单击后开始键入 - 这是正确的做法。

2这是因为你没有删除你创建的同一个处理程序吗?您应该保留对使用第一个绑定调用创建的处理程序的引用,并将此引用传递给remove调用 - 否则您将创建另一个(不同的)处理程序并要求删除它。

E.g:

var f = this.keyboardNavigation.bind(this);
document.addEventListener('keydown', f);
document.removeEventListener('keydown', f);