2

请帮我简化这段代码。

关于如何组合最后两个 if 语句同时保持功能相同的任何想法。

谢谢。

document.addEventListener("keydown", function(e) { // shortcuts
  var mapping = {
    "noctrl9": function() { // tab
      var sStart = textarea.selectionStart,
        text = textarea.value;
      textarea.value = text.substring(0, sStart) + "\t" + text.substring(textarea.selectionEnd);
      textarea.selectionEnd = sStart + 1;
    },
    66: function() { // B
      showHideStatusBar(statusBarOn ? false : true);
    },
    79: openDoc, // O
    82: newDoc, // R
    83: saveDoc, // S
    191: function() { // /
      alert("Welcome to " + appname + "!");
    }
  };
  if (e.ctrlKey && mapping[e.keyCode]) {
    e.preventDefault();
    mapping[e.keyCode]();
  }
  if (mapping["noctrl" + e.keyCode]) {
    e.preventDefault();
    mapping["noctrl" + e.keyCode]();
  }
});
4

1 回答 1

2

您可以将逻辑结果保存在变量中,然后单独检查。

var fn = e.ctrlKey && mapping[e.keyCode] || mapping['noctrl' + e.keyCode];
if (fn) {
  e.preventDefault();
  fn();
}

赋值等价于:

var fn;
if (e.ctrlKey && mapping[e.keyCode])
  fn = mapping[e.keyCode];
else
  fn = mapping['noctrl' + e.keyCode];

或者,更短一点:

var fn = e.ctrlKey ? mapping[e.keyCode] : mapping['noctrl' + e.keyCode];

或者,当我们享受变化的乐趣时,这有点干:

var fn = mapping[(e.ctrlKey ? "" : "noctrl") + e.keyCode];

请注意,第二个if测试也可以重写:

fn && (e.preventDefault(), fn());

然而,这对我来说有点太简洁了。

于 2013-11-10T19:32:55.560 回答