Просто бросить еще одну шляпу в кольцо. Определение символов в событиях нажатия клавиш не является тем, что JavaScript делает очень хорошо прямо сейчас. Из-за его изменчивости я предпочел бы не принуждать какой-либо метод к расшифровке его inline и отложить оценку до другого метода, который может быть введен и выровнен.
Идеальным будет метод, который принимает в качестве аргумента KeyUp Event
и возвращает любой персонаж: назовем его MapKeyPressToActualCharacter
.
Тогда ваш код может выглядеть супер чистый, как это:
$("#id").on("keyup", function(e){
switch(MapKeyPressToActualCharacter(e)) {
case "#":
//handle #
break;
case "@":
//handle @
break;
}
});
Теперь мы должны выяснить, как писать MapKeyPressToActualCharacter
.
Вот реализация на основе ответа на get key char from keycode with shift modifier:
function MapKeyPressToActualCharacter(event) {
var isShiftKey = event.shiftKey;
var characterCode = event.keyCode;
var isAlphabetChar = characterCode >= 65 && characterCode <= 90;
var specialChars = [8,9,13,16,17,18,20,27,91,92];
var character = "";
if (valueInArray(characterCode, specialChars)) {
return false;
}
if (isAlphabetChar) {
character = String.fromCharCode(characterCode);
} else if (isShiftKey) {
character = GetShiftedCharacters()[characterCode];
} else {
character = String.fromCharCode(characterCode);
}
return character;
}
function valueInArray(value, array) {
return array.indexOf(value) > -1;
}
Вам также необходимо, чтобы получить отображение каждого символа, и это сдвинуто следствие с помощью метода GetShiftedCharacters
:
function GetShiftedCharacters() {
var characterMap = {32: " ",
48: ")",
49: "!",
50: "@",
51: "#",
52: "$",
53: "%",
54: "^",
55: "&",
56: "*",
57: "(",
59: ":",
107: "+",
109: "_",
188: "<",
190: ">",
191: "?",
192: "~",
219: "{",
220: "|",
221: "}",
222: "\\" };
return characterMap;
}
* Обратите внимание, что поскольку функция MapKeyPress вызывает array.indexOf
, вы должны использовать polyfill для расширения до старых браузеров. Вот shiv под названием indexOfPolyFill.js, и вот example.
event.shiftKey? – crnlx
Кодовый ключ для 2 и @ будет таким же, вам нужно проверить ключ переключения. –
Можете ли вы показать код, чтобы посмотреть, что вы пытаетесь? – jcho360