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