2011-04-19 185 views
4

为了研究开发中的应用程序,我添加了常见任务的键盘快捷键。我可以起诉Ext.KeyMap要做到这一点是这样的...ExtJS使用Ext.KeyMap监听全局按键

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

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

我的想法是检测单数keystroke,添加一个侦听器来检测后续关键笔划。为了处理它们之间的差距,请设置一个延迟事件,在x时间后删除侦听器。

任何改进/建议/警告?

回答

4

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

+0

我明白你在说什么....但是不得不存储每一个被按下的键并做一个比较,但对我来说这似乎不是很好的做法。我想除了你建议的东西外,没有办法检测到双击... – neolaser 2011-04-19 05:22:20

+0

不知道这是你的意思,但你不必储存_every_键,只是最后一个。无论如何,我想这种方法看起来有点麻烦,但它实际上应该是非常简单和短的编码逻辑。加上内存时间戳会很小(只是最后一个键码和时间戳)。 – Tommi 2011-04-19 10:44:09

0

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

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 
}); 

这段代码的probem是快速按ENTER - DELETE - ENTER也将触发事件仿佛ENTER - ENTER是按下。如果这是不可接受的,那么你必须跟踪所有的按键 - 我认为你必须使用Ext.get("my-element").on("keypress")