为了改进我正在开发的应用程序,我正在为常见任务添加键盘快捷键。我可以起诉Ext.KeyMap
这样做......
var map = new Ext.KeyMap("my-element", {
key: 13, // or Ext.EventObject.ENTER
fn: myHandler,
scope: myObject
});
但我想检测“ss”或“qq”,即字母的特定双键击。我不知道怎么做....
我的想法是检测单个击键,添加一个侦听器来检测以下击键。为了处理它们之间的差距,设置一个延迟事件,在x个时间后删除监听器。
任何改进/建议/警告??
答案 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")
。