Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ExtJS使用Ext.KeyMap监听全局击键_Javascript_Extjs_Keyboard Shortcuts - Fatal编程技术网

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

Javascript ExtJS使用Ext.KeyMap监听全局击键,javascript,extjs,keyboard-shortcuts,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”,即字母的特定双键笔划。我不知道怎么做 我的想法是检测单一的击键,添加一个监听器来检测接下来的击键。要处理它们之间的间隙,

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

var map = new Ext.KeyMap("my-element", {
    key: 13, // or Ext.EventObject.ENTER
    fn: myHandler,
    scope: myObject
});
但我想检测“ss”或“qq”,即字母的特定双键笔划。我不知道怎么做

我的想法是检测单一的击键,添加一个监听器来检测接下来的击键。要处理它们之间的间隙,请设置一个延迟事件,该事件在x个时间量之后删除侦听器


有什么改进/建议/警告吗?

我不知道你为什么需要一个额外的听众。为什么不将上一次击键存储在一个变量中(带有击键发生时的时间戳)。然后您可以将最新的击键与以前的击键进行比较。如果它们是相同的,并且存储的时间戳在过去不太远,那么这就是您要查找的双键。如果按键代码不同,或者存储的时间戳太旧,只需使用新值更新存储的按键代码和时间戳。

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

类似于这样的东西:

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(“我的元素”).on(“按键”)

我明白你的意思……但是必须存储按下的每个键并进行比较,但对我来说这似乎不是一个好的做法。我想除了像你建议的那样,没有办法检测双笔画……不确定这是否是你的意思,但你不必存储每个键,只存储最后一个键。无论如何,我想这种方法可能看起来有点麻烦,但实际上它应该非常简单,并且代码逻辑简短。加上内存时间戳将非常小(只有最后一个键码和时间戳)。