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

时间:2012-01-08 09:27:48

标签: javascript jquery keycode

我已经在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()并手动将所需的键插入输入字段,然后将光标移动到结尾”。我想要更清洁和“正确”的解决方案。谢谢。

4 个答案:

答案 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;
}