自定义键绑定的结构?

时间:2014-03-31 03:54:52

标签: javascript

我正在寻找一种用于存储和调度自定义(由最终用户)键绑定的结构。

我在考虑这样的结构:

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+LCTRL+SHIFT+L,这当然是你想要的。我确实喜欢在vs循环中使用的能力。

是否有人为用户定义的热键映射实现了可以共享的结构?

1 个答案:

答案 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;
}