ExtJS使用Ext.KeyMap监听全局击键

时间:2011-04-19 04:45:41

标签: javascript extjs keyboard-shortcuts

为了改进我正在开发的应用程序,我正在为常见任务添加键盘快捷键。我可以起诉Ext.KeyMap这样做......

var map = new Ext.KeyMap("my-element", {
    key: 13, // or Ext.EventObject.ENTER
    fn: myHandler,
    scope: myObject
});

但我想检测“ss”或“qq”,即字母的特定双键击。我不知道怎么做....

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

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

3 个答案:

答案 0 :(得分:4)

我不确定为什么你需要一个额外的监听器。为什么不将先前的击键存储在变量中(使用键击发生时的时间戳)。然后你可以将最新的击键与之前的击键进行比较。如果它们是相同的,并且存储的时间戳在过去并不太远,那就是你所追求的双键。如果密钥代码不相同,或者存储的时间戳太旧,只需使用新值更新存储的密钥代码和时间戳。

答案 1 :(得分:0)

您不必记住所有按下的按键,只记住最后一个按键。当你想到双击事件时,它是相似的,但是因为点击两次更受欢迎,它已经为我们实现了。

答案 2 :(得分: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 < / kbd> - ENTER 被按下。如果这是不可接受的,那么你必须跟踪所有的按键 - 我认为你必须使用Ext.get("my-element").on("keypress")