Javascript 自定义密钥绑定的结构?

Javascript 自定义密钥绑定的结构?,javascript,Javascript,我希望创建一个用于存储和分派自定义(由最终用户)密钥绑定的结构 我在想一个结构,比如: UserPrefs:{ KeyBindings:{ "I":{ Key:"I", CTRL:true, Action:"ToggleInteractiveMode" }, "S":{ Key:"S", CTRL:true, Action:"SaveSelecte

我希望创建一个用于存储和分派自定义(由最终用户)密钥绑定的结构

我在想一个结构,比如:

UserPrefs:{
   KeyBindings:{
      "I":{
         Key:"I",
         CTRL:true,
         Action:"ToggleInteractiveMode"
      },
      "S":{
         Key:"S",
         CTRL:true,
         Action:"SaveSelectedRecord"
      },
      "E":{
         Key:"E",
         CTRL:true,
         Action:"EditSelectedRecord"
      },
   },
}
然后是一个全局键控函数,如:

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();
   }
}
当然,这个模型的问题是,通过使用键作为键,你不能为一个给定的键存储多个组合,也就是说,你不能有一个
CTRL+L
和一个
CTRL+SHIFT+L
,这当然是你想要的。不过,我确实喜欢在vs循环中使用的功能


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

我解决了这样的问题: 首先,描述所有键组合:

var keyBindings = [
  {
    Key: "I",
    Action: "ToggleInteractiveMode"
  },
  {
    Key: "I",
    CTRL: true,
    Action: "ToggleInteractiveMode+Ctrl"
  },
  {
    Key: "I",
    CTRL: true,
    SHIFT: true,
    Action: "ToggleInteractiveMode+Ctrl+Shift"
  }
];
然后初始化密钥:

keyBindings.forEach( function( keyObject ) {
  var keyName = "";
  if ( keyObject.CTRL ) {
    keyName += "CTRL_";
  }
  if ( keyObject.SHIFT ) {
    keyName += "SHIFT_";
  }
  keyName += keyObject.Key;
  keyBindings[keyName] = keyObject;
} );
现在,键绑定包含“I”、“CTRL\u I”、“CTRL\u SHIFT\u 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;
}