ExtJS使用Ext.KeyMap监听全局按键事件

4
为了改进我正在开发的应用程序,我正在添加常见任务的键盘快捷方式。我可以使用Ext.KeyMap来实现这一点,如下所示...
var map = new Ext.KeyMap("my-element", {
    key: 13, // or Ext.EventObject.ENTER
    fn: myHandler,
    scope: myObject
});

但我想检测“ss”或“qq”,即特定的双字母击键。我不确定如何做到这一点....

我的想法是检测单个按键,添加一个监听器以检测后续按键。为了处理它们之间的间隔,设置一个延迟事件,在x时间后删除监听器。

有任何改进/建议/警告吗?

3个回答

4

我不确定为什么您需要在此处添加额外的监听器。为什么不将前一个按键(以及按键发生的时间戳)存储在变量中呢?然后,您只需比较最新的按键和前一个按键即可。如果它们相同,并且存储的时间戳不太久远,那就是您要找的双按键。如果按键代码不同,或者存储的时间戳太旧,只需使用新值更新存储的按键代码和时间戳。


我理解你的意思,但是需要存储每次按键并进行比较似乎不是一个好的做法。我想除了你所建议的方式外,没有其他检测双击的方法了。 - neolaser
不确定这是否是您的意思,但您不必存储“每个”键,只需存储最后一个键。无论如何,我想这种方法似乎有些繁琐,但实际上编码逻辑应该非常简单和简短。此外,内存时间戳将非常小(仅为最后一个按键代码和时间戳)。 - Tommi

0

类似这样:

function defineDoubleKeyMap(element, cfg) {
    var repeated, timer;
    return new Ext.KeyMap(element, {
        key: cfg.key,
        fn: function() {
            if (repeated) {
                // when clicked the second time
                // stop timer and call our callback
                repeated = false;
                clearTimeout(timer);
                cfg.fn.call(cfg.scope);
            }
            else {
                // remember we clicked once, forget after delay
                repeated = true;
                // adjust the delay as needed.
                // current 1 sec is probably too long
                timer = (function(){
                    repeated = false;
                }).defer(1000);
            }
        }
    });
}

defineDoubleKeyMap("my-element", {
    key: Ext.EventObject.ENTER,
    fn: myHandle,
    scope: myObject
});

这段代码的问题在于快速按下 ENTER-DELETE-ENTER 也会触发事件,就像按下 ENTER-ENTER 一样。如果不能接受这种情况,那么你就必须跟踪所有按键 - 我认为你要使用 Ext.get("my-element").on("keypress") 来实现。

0

你不需要记住所有按下的键,只需记住最后一个。当你考虑双击事件时,它是类似的,但由于双击更受欢迎,它已经为我们实现了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接