如何捕获event.keyCode并将其更改为另一个keyCode?

我在这里检查了其他问题,但他们没有回答我的问题。 我想简单地捕获某些keyCode并将其替换为另一个。 我正在处理角色,而不是白色空间,我不需要松散焦点等。

以下是我的代码。 但你可以用你的那些替换那些keyCodes(例如,当按下大写“A”时,它应该替换为零0等)。 想法是替换keyCode。

phrase.keypress(function(event) { if (event.shiftKey) { switch (event.keyCode) { // Cyrillic capitalized "Н" was pressed case 1053: event.keyCode = 1187; event.charCode = 1187; event.which = 1187; break; // Cyrillic capitalized "О" was pressed case 1054: event.keyCode = 1257; event.charCode = 1257; event.which = 1257; break; // Cyrillic capitalized "У" was pressed case 1059: event.keyCode = 1199; event.charCode = 1199; event.which = 1199; break; } } }); 

我也尝试过keydown和keyup。 它们不会改变keyCode。 我怎样才能做到这一点?

PS如果可能的话,我正在寻找一种解决方案,它不会“event.preventDefault()并手动将所需的键插入输入字段,然后将光标移动到末尾”。 我想要更清洁和“正确”的解决方案。 谢谢。

键盘事件属性都是只读的。 您无法捕获一个keyCode并将其更改为另一个。

请参阅MDN参考 – 键盘事件 – 所有内容都是只读的,无法设置。

正如你在post中提到的那样。 – 如果您不想处理,则必须停止浏览器默认按键并自行设置所需的值。

我正在使用以下代码来实现相同的结果,就像我更改了keyCode ,而实际上无法更改它。

 function inputValidation() { var srcField = event.srcElement; var sKey = event.keyCode; var inputLetter = String.fromCharCode(sKey); if (typeof(srcField) !== "undefined" && srcField !== null) { inputLetter = transformInput(inputLetter); var caretPos = srcField.selectionStart; var startString = srcField.value.slice(0, srcField.selectionStart); var endString = srcField.value.slice(srcField.selectionEnd, srcField.value.length); srcField.value = startString + inputLetter + endString; setCaretPosition(srcField, caretPos+1); // '+1' puts the caret after the input event.preventDefault ? event.preventDefault() : event.returnValue = false; //for IE8 } } 

srcField.selectionStart给出了您选择的文本的起始位置,如果您没有选择任何文本srcField.selectionStart等于srcField.selectionEnd ,则srcField.selectionEnd给出选择的结束位置。

函数setCaretPosition来自kd7的这个答案 。 我只更改了它以使它接收元素而不是它的Id

 function setCaretPosition(elem, caretPos) { if (elem != null) { if (elem.createTextRange) { var range = elem.createTextRange(); range.move('character', caretPos); range.select(); } else { if (elem.selectionStart) { elem.focus(); elem.setSelectionRange(caretPos, caretPos); } else elem.focus(); } } }