请帮我简化这段代码。
关于如何在保留功能相同的情况下组合最后两个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]();
}
});
答案 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());
然而,这对我来说有点太简洁了。