我想知道这是不是......
inputs.keydown(function (e) {
switch (e.keyCode) {
case 13: //Enter
case 16: //Shift
case 17: //Ctrl
case 18: //Alt
case 19: //Pause/Break
case 20: //Caps Lock
case 27: //Escape
case 35: //End
case 36: //Home
case 37: //Left
case 38: //Up
case 39: //Right
case 40: //Down
// Mac CMD Key
case 91: //Safari, Chrome
case 93: //Safari, Chrome
case 224: //Firefox
break;
default:
$(this).addClass(fill);
break;
}
});
...也可以用更少的线路?
我知道我可以做一个if条件,但我想知道我是否错过了case 13 && 16 && …
也许你们中的一些人知道更好的做法来检查所有案例并编写更少的代码行。 我只是想知道。
提前谢谢!
答案 0 :(得分:8)
您可以创建一个您不想处理的键的“地图” - 地图查找应该介于O(1)
和O(log n)
之间,具体取决于实现。
var specialKeys = {
13: 1, // Enter
16: 1, // Shift
...
224: 1 // Cmd/FF
};
inputs.keydown(function (e) {
if (e.keyCode in specialKeys) return;
$(this).addClass(fill);
});
或者,因为你的“键”都是整数,你可以填充索引是关键代码值的数组。
编辑删除字符串,如@bažmegakapa
所示答案 1 :(得分:7)
只需将代码放入数组中,然后您只需检查该值是否在数组中。由于您使用的是jQuery,因此您已经有inArray()
方法来执行此操作。
var keycodes = [13, 16, 17, 18, 19]; //and so on
//if the keycode is not found in the array, the result will be -1
if ($.inArray(e.keyCode, keycodes) === -1) {
$(this).addClass(fill);
}
答案 2 :(得分:2)
你有什么好。很明显,它会得到相当有效的处理。或者,您可以使用Array#indexOf
:
var list1 = [
13, //Enter
16, //Shift
17, //Ctrl
18, //Alt
19, //Pause/Break
20, //Caps Lock
27, //Escape
35, //End
36, //Home
37, //Left
38, //Up
39, //Right
40 //Down
];
var list2 = [
91, //Safari, Chrome
93, //Safari, Chrome
224 //Firefox
];
inputs.keydown(function (e) {
if (list1.indexOf(e.keyCode) !== -1) {
// ...
}
else if (list2.indexOf(e.keyCode) !== -1) {
// ...
}
else {
$(this).addClass(fill);
}
});
但是如果你丢失评论,那么代码的“行”就会减少,而且评论似乎(对我而言)很重要。
请注意,一些相当旧的浏览器不会有Array#indexOf
,因此您可能需要对其进行填充(这很容易)。或者使用jQuery.inArray
代替,因为你正在使用jQuery。
答案 3 :(得分:0)
恕我直言,使用您指出的代码更清楚,但为了您的方便,您可以使用案例中的条件......
case (condition):
//code
break;
就个人而言,我会将所有可能的匹配放入一个数组中,并使用in_array()中的phpjs.org来检查要测试的值是否存在。