JS - 键盘事件 - 听/不听

时间:2013-02-25 10:45:21

标签: javascript javascript-events event-handling keyboard-events

我有一个关于JS中键盘事件的问题。

首先,请不要回答我使用jQuery方法,我知道大部分内容(绑定/取消绑定,开/关,一个......)但我使用内部框架必须在没有jQuery的情况下工作,即使我们的大多数项目都使用了jQuery。

所以,我有一个模块,实际上是一个基于Swipe.js的滑动工具,可以扩展到Web和移动环境(IE 7 +,WebKit(Chrome& Safari),Moz,Opera所需的兼容性)和IE10 / Windows Phone)

对于鼠标/触摸事件没有任何问题,来自the mobile HTML5 BP的绑定和解除绑定方法似乎可以很好地处理detachEvents方法的小修正。

然后我会基于'keydown'事件实现键盘控制功能。 (顺便说一下,我不确定keydon和keypress事件之间有什么不同,除了keypressEvent.preventDefault()不会阻止小滚动效果,所以我使用keydown。)

由于可以在同一页面上添加许多Swipe,因此只有在任何Swipe聚焦时才会开始监听keydown事件(请注意,我添加了一个“tabindex”属性以允许元素聚焦)。

<div id="swipe1" class="swipe" tabindex='0'>
    <ul>
        [...]
    </ul>
</div>

然后当Swipe处理'touchstart'/'click'/'MSPointerDown'事件时, 我关注它:

onTouchStart: function(e) {
    this.container.focus(); // Refers to the div#swipe1.swipe element
    [...]
    return false;
}

onFocus: function (e) {
    if (this.activateKeyboardControls) { // Keyboard control is optional
        this.addListener(document, 'keydown', this, true);
    }
}

onBlur: function (e) {
    if (this.activateKeyboardControls) { // Keyboard control is optional
        this.removeListener(document, 'keydown', this, true);
    }
}

但遗憾的是,removeListener不起作用。

我的意思是,当元素失去焦点(模糊事件被触发)时,它仍然处理keydown事件......

是因为它在文档对象上绑定了吗? 我已经阅读了一些使用一些布尔值的解决方案,但我正在寻找一种更清洁的方式来管理它。

这很烦人,因为当我把焦点放在很多Swipes上时,当我按下键盘时,每个Swipe都会滑动。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我不确定我的答案被删除的原因 - 发布后超过2周 - 但无论如何,这就是我解决它的方式:

它来自addEventListener / attachEvent方法的'type'参数,这是第一个...

我将它绑定在对象而不是窗口上,而不是冒泡。

var target = e.target || e.srcElement;
if (this.activateKeyboardControls) {
    this.addListener(target, 'keydown', this, false);
}