确定JavaScript e.keyCode是否是可打印(非控制)字符

时间:2012-09-17 21:17:41

标签: javascript keycode

我只想知道与可输入字符对应的JavaScript keyCode的范围;或者,不可键入(控制)字符的范围,如退格,转义,命令,移位等,所以我可以忽略它们。

我问的原因是调用String.fromCharCode()导致控制键出现奇数字符。例如,左侧命令为“[”,左箭头为“%”。这样的怪异。

5 个答案:

答案 0 :(得分:81)

Keydown将为您提供按下的键的keyCode,无需任何修改。

$("#keypresser").keydown(function(e){
    var keycode = e.keyCode;

    var valid = 
        (keycode > 47 && keycode < 58)   || // number keys
        keycode == 32 || keycode == 13   || // spacebar & return key(s) (if you want to allow carriage returns)
        (keycode > 64 && keycode < 91)   || // letter keys
        (keycode > 95 && keycode < 112)  || // numpad keys
        (keycode > 185 && keycode < 193) || // ;=,-./` (in order)
        (keycode > 218 && keycode < 223);   // [\]' (in order)

    return valid;
});

只有数字键,字母键和空格键才会有与String.fromCharCode相关的键码,因为它使用的是Unicode值。

Keypress将是输入文本的charCode表示。请注意,如果由于按键没有“打印”文本,则不会触发此事件。

$("#keypresser").keypress(function(e){
    var charcode = e.charCode;
    var char = String.fromCharCode(charcode);
    console.log(char);
});

http://jsfiddle.net/LZs2D/1/将演示这些是如何工作的。

KeyUp的行为与KeyDown类似。

答案 1 :(得分:14)

只是为了后台,只要按下字符键,“keypress”事件就会为您提供 charCode 属性。

Editor.addEventListener('keypress', function(event){
    if (event.charCode) {
        //// character key
        console.log( String.fromCharCode(event.charCode) ); /// convert charCode to intended character.
    } else {
        //// control key
    }

但是,“按键”事件并不会捕获每次按键 - 在“按键”事件发生之前会触发几个按键。

相反,“keydown”事件将捕获每次击键,但它没有 charCode 属性。那么我们如何判断它是否是一个字符键呢?检查每个键击是否 keyCode 在多个范围的下限和上限内是不是最佳效率。我怀疑ASCII范围之外的字符也存在问题。

我的方法是检查事件“key”属性的长度。 “key”属性是“keyCode”的替代,用于确定按下了哪个键。对于控制键,“key”属性为描述性(例如“rightArrow”,“F12”,“return”等)。对于字符键,字符键的“key”属性为只是字符(例如“a”,“A”,“〜”,“\”等)。因此,对于每个字符键,“key”属性的长度将为1;而控制字符的长度大于1。

Editor.addEventListener('keydown', function(event){
    if (event.key.length == 1){ 
        //// character key
    } else {
        //// control key
    }
})

答案 2 :(得分:4)

答案 3 :(得分:1)

您还可以为此使用RegEx:

$(".input").keyup(function (event) {
    if (event.key.match(/^[\d\w]$/i)) {
      // put function to trigger when a digit or a word character is pressed here
    }

i标志使表达式不区分大小写。

答案 4 :(得分:0)

我注意到所有长度为1('A','B',数字,符号)的字符都可以打印 所以我只用。 我也将这种解决方案用于非英语字符:

if(e.key.length==1)
    print();