我已经在SO处检查了其他问题,但他们没有回答我的问题。我想简单地捕获某些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。我怎么能这样做?
P.S。如果可能的话,我正在寻找一个解决方案,它不会“event.preventDefault()并手动将所需的键插入输入字段,然后将光标移动到结尾”。我想要更清洁和“正确”的解决方案。谢谢。
答案 0 :(得分:8)
键盘事件属性都是只读的。您无法捕获一个keyCode并将其更改为另一个。
参见MDN的参考资料 - Keyboard Events - 所有内容都是只读的。
正如你在帖子中提到的那样。 - 如果你不想处理,那么你必须停止浏览器默认按键并自己设置所需的元素值。
答案 1 :(得分:3)
我正在使用以下代码来获得与更改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.selectionEnd
给出了选择的结束位置,如果您没有选择任何文字srcField.selectionStart
等于{{1} }。
函数srcField.selectionEnd
来自this answer kd7。我只更改了它以使它接收元素而不是它的Id
setCaretPosition
答案 2 :(得分:0)
尽管KeyboardEvent实例上的属性为只读,但是您可以覆盖KeyboardEvent
的原型,并为要更改的内容创建一个吸气剂。这是一个将hjkl的键码更改为类似于箭头键的示例。
Object.defineProperty(KeyboardEvent.prototype, 'keyCode', {
get: function() {
switch (this.key) {
case 'h': return 37; // left
case 'j': return 40; // down
case 'k': return 38; // up
case 'l': return 39; // right
default: return this.which
}
}
})
答案 3 :(得分:0)
您可以将值更改为手动并处理按键。如果要检查密钥,请声明一个变量并检查您的密钥代码。
this.event.target.value = this.event.target.value + ".";
return false;
完整代码:
function isNumberKeyDec(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
var apos = 0;
if (charCode == 44) {
apos = 1;
charCode = 46;
}
if (this.event.target.value.length == 0 && charCode == 46) {
return false;
}
if (this.event.target.value.length == 1 && this.event.target.value == "0" && charCode == 48) {
return false;
}
if (this.event.target.value.length == 1 && this.event.target.value == "0" && charCode != 46) {
this.event.target.value = "";
}
if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 46) {
return false;
}
if (charCode == 46 && this.event.target.value.indexOf(".") != -1) {
return false;
}
if (this.event.target.value.indexOf(".") != -1) {
if (this.event.target.value.substring(this.event.target.value.toString().indexOf(".")).length >= 2) {
return false;
}
}
if (this.event.target.value.indexOf(".") == -1 && charCode != 46) {
if (this.event.target.value.length >= 3 && charCode != 46) {
return false;
}
}
if (apos == 1) {
this.event.target.value = this.event.target.value + ".";
return false;
}
return true;
}