简化这段javascript代码(如果)

时间:2013-11-10 19:27:12

标签: javascript

请帮我简化这段代码。

关于如何在保留功能相同的情况下组合最后两个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]();
  }
});

1 个答案:

答案 0 :(得分: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());

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