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

dev*_*os1 54 javascript keycode

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

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

Shm*_*dty 83

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;
});
Run Code Online (Sandbox Code Playgroud)

只有数字键,字母键和空格键将具有与String.fromCharCode使用Unicode值相关的键码.

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

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

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

KeyUp的行为与KeyDown类似.

  • 许多字符都会丢失,例如`,`或`%` (3认同)
  • 第一个解决方案在国际上效果好吗?另外,检查无效密钥不是更好吗? (3认同)
  • @QuentinEngles-我几乎肯定它在国际上不起作用:http://daniel-hug.github.io/characters/#k_49 (2认同)

小智 17

我注意到所有长度为 1 ('A','B',number,symbol) 的字符都是可打印的,所以我只使用。我也将此解决方案用于非英文字符:

if(e.key.length==1)
    print();
Run Code Online (Sandbox Code Playgroud)

  • 哦,还有:在大多数情况下,您希望忽略按下 ctrl/alt/meta 的事件 - Ctrl+C 不会输入可打印字符,即使 `c` 是可打印的。 (2认同)

iam*_*mio 15

只是为了背景,只要按下一个字符键,"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
    }
Run Code Online (Sandbox Code Playgroud)

但是,"按键"事件不会捕获每次按键 - 在"按键"事件之前会触发几个按键.

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

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

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