我正在寻找一种用于存储和调度自定义(由最终用户)键绑定的结构。
我在考虑这样的结构:
UserPrefs:{
KeyBindings:{
"I":{
Key:"I",
CTRL:true,
Action:"ToggleInteractiveMode"
},
"S":{
Key:"S",
CTRL:true,
Action:"SaveSelectedRecord"
},
"E":{
Key:"E",
CTRL:true,
Action:"EditSelectedRecord"
},
},
}
然后是一个全局的KeyUp函数,如:
eGlobalKeyUp = function(e, eventThis){
if(!e.which in UserPrefs.KeyBindings)
return; // This key or combo is not bound
if(UserPrefs.KeyBindings[e.which].CTRL === e.ctrlKey &&
UserPrefs.KeyBindings[e.which].ALT === e.altKey &&
UserPrefs.KeyBindings[e.which].SHIFT === e.shiftKey
){
UserPrefs.KeyBindings[e.which].Action();
}
}
当然这个模型的问题是,通过使用Key作为 Key ,你不能为给定的密钥存储多个组合,即。你不能拥有CTRL+L
和CTRL+SHIFT+L
,这当然是你想要的。我确实喜欢在vs循环中使用的能力。
是否有人为用户定义的热键映射实现了可以共享的结构?
答案 0 :(得分:0)
我这样解决了这样的问题: 首先,描述所有关键组合:
var keyBindings = [
{
Key: "I",
Action: "ToggleInteractiveMode"
},
{
Key: "I",
CTRL: true,
Action: "ToggleInteractiveMode+Ctrl"
},
{
Key: "I",
CTRL: true,
SHIFT: true,
Action: "ToggleInteractiveMode+Ctrl+Shift"
}
];
然后是init键:
keyBindings.forEach( function( keyObject ) {
var keyName = "";
if ( keyObject.CTRL ) {
keyName += "CTRL_";
}
if ( keyObject.SHIFT ) {
keyName += "SHIFT_";
}
keyName += keyObject.Key;
keyBindings[keyName] = keyObject;
} );
现在keyBindings包含“I”,“CTRL_I”,“CTRL_SHIFT_I”之类的键。
现在在eGlobalKeyUp中你可以使用这样的东西:
var prefix = "";
if ( e.ctrlKey ) {prefix += "CTRL_";}
if ( e.shiftKey ) {prefix += "SHIFT_";}
if ( keyBindings[prefix + e.which] ) {
keyBindings[prefix + e.which].Action();
}
else {
return;
}