我有一个关于JS中键盘事件的问题。
首先,请不要建议我使用jQuery方法,我知道大部分方法(bind/unbind, on/off, one...),但是我使用的是一个内部框架,即使在我们的大多数项目中都使用了jQuery,该框架必须在没有jQuery的情况下工作。
所以,我有一个模块,实际上是基于Swipe.js扩展的滑动工具,在Web和移动环境下都能使用(兼容IE 7+、WebKit(Chrome和Safari)、Moz、Opera和IE10/Windows Phone)。
对于鼠标/触摸事件,我没有任何问题,灵感来自于mobile HTML5 BP的绑定和解绑方法似乎非常有效,只需对detachEvents方法进行一些小的更改即可。
然后,我想实现一个基于“keydown”事件的键盘控制功能。 (顺便说一下,我不确定如何区分keydon和keypress事件,除了keypressEvent.preventDefault()无法防止小滚动效果外,因此我使用keydown。)
由于同一页可以添加多个Swipes,因此我只有在任何Swipe获得焦点时才开始监听keydown事件(请注意,我添加了“tabindex”属性以允许元素获得焦点)。
<div id="swipe1" class="swipe" tabindex='0'>
<ul>
[...]
</ul>
</div>
当滑动处理'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 不起作用。
我的意思是,当元素失去焦点(触发 blur 事件)时,它仍然处理 keydown 事件...
这是因为它绑定在 document 对象上吗? 我已经阅读了一些解决方案,可以使用一些布尔值来解决,但我正在寻找一种更清洁的方式来管理它。
这很烦人,因为当我将焦点放在许多 Swipe 上时,每个 Swipe 都会在我按键盘时滑动。