代码之家  ›  专栏  ›  技术社区  ›  Remotec

JavaScript键码与CharCode

  •  40
  • Remotec  · 技术社区  · 14 年前

    问题是:

    • 仅将HTML输入中允许的字符限制为a-z a-z。
    • 对于业务需求,这需要在按键上完成,这样就不允许字符出现在输入中。
    • Tab,enter,arrows,backspace,shift都是允许的。用户必须能够自由进出文本框,删除字符等。

    这是我代码的起点。。。

    var keyCode = (e.keyCode ? e.keyCode : e.which);
    

    但是我得到的每一个价值 密码 不符合 任何 我在网上看到的人物图表。例如,字符“h”给我返回码104。

    KeyCode和CharCode不同吗?哪个代码包含控制字符?我需要改变信仰吗?

    如何将输入限制为a-z a-z并在JavaScript中允许所需的键?

    8 回复  |  直到 9 年前
        1
  •  64
  •   Michał Perłakowski    9 年前

    你所有问题的答案都可以在 the following page .

    ……但总而言之:

    • 唯一可以可靠地获取字符信息(与键代码信息相反)的事件是 keypress 事件。
    • 按键 事件,除IE<=8之外的所有浏览器都将字符代码存储在事件的 which 财产。大多数(但不是所有)浏览器也将字符代码存储在 charCode 财产。
    • 按键 event,IE<=8将字符代码存储在 keyCode 财产。

    这意味着要获得与keypress对应的字符代码,假设keypress事件对象存储在一个名为 e :

    var charCode = (typeof e.which == "number") ? e.which : e.keyCode
    

    这通常会返回一个字符代码,其中存在一个字符,否则返回0。有一些情况下,当您不应该得到非零值时,您会得到非零值:

    • 歌剧中的10.50键 插入 , 删除 , 终点
    • 用于非字符键的最新版本的konqueryr。

    第一个问题的解决方法有点复杂,需要使用 keydown 事件也一样。

        2
  •  10
  •   nicopolyptic    11 年前

    好悲伤。KeyboardEvent。[key,char,keyCode,charCode,which]根据Mozilla的API文档,都是不推荐使用的,或者目前有未解决的bug- https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent . 甚至JQuery也会在这个问题上推卸责任,让用户自己解决 https://api.jquery.com/keydown/ .

        3
  •  5
  •   Han Seoul-Oh    14 年前

    实际上,104是小写'h'的ASCII码。要在keypress上获取键入字符的ASCII码,只需使用 e.which || e.keyCode ,而且您不必担心按住键,因为对于键入的文本,在所有浏览器中都会自动重复按键(根据 http://unixpapa.com/js/key.html ).

    所以你真正需要的是:

    <input id="textbox">
    
    <script type="text/javascript">
    document.getElementById('textbox').onkeypress = function(e){
      var c = e.which || e.keyCode;
      if((c > 31 && c < 65) || (c > 90 && c < 97) || (c > 122 && c !== 127))
        return false;
    };
    </script>
    

    试试看: http://jsfiddle.net/wcDCJ/1/

    (ASCII码来自 http://en.wikipedia.org/wiki/Ascii )

        4
  •  2
  •   James Long    14 年前

    onKeyPress有不同的大小写字母代码。你可能会发现,打开盖锁,然后键入你的信会给你期望的代码

    onKeyUp和onKeyDown对于大写字母和小写字母具有相同的字符代码。建议使用onKeyUp,因为它最接近onKeyPress

        5
  •  0
  •   kennebec    14 年前

    /* 对于非打印键,你不会在键盘上得到键码, 为什么不把它们记在键盘上呢? */

    function passkeycode(e){
        e= e || window.event;
        var xtrakeys={
            k8: 'Backspace', k9: 'Tab', k13: 'Enter', k16: 'Shift', k20: 'Caps Lock',
            k35: 'End', k36: 'Home', k37: 'Ar Left', k38: 'Ar Up', k39: 'Ar Right',
            k40: 'Ar Down', k45: 'Insert', k46: 'Delete'
        },
        kc= e.keyCode;
        if((kc> 64 && kc<91) || xtrakeys['k'+kc]) return true;
        else return false;
    }
    
    inputelement.onkeydown=passkeycode;
    

    kc>64&kc<91//a-zA-Z

    xtrakeys['k'+integer])定义允许的特殊键码

        6
  •  0
  •   Mac    9 年前

    下面是标记示例:

    <form id="formID">
        <input type="text" id="filteredInput">
        <input type="text" id="anotherInput">
    </form>
    

    以下逻辑可用于捕获键盘输入(在本例中,通过jQuery文档就绪包装器)。

    它可能读起来有点傻,但基本上,我检查所有我想允许的内容(在你的情况下,字母a到Z不区分大小写) 什么也不做 . 换句话说,默认操作是允许的,但是除了alpha之外的任何输入都是禁止的。

    检查并允许标准键盘导航,如箭头键、Home、End、Tab、Backspace、Delete等。

    注意:这段代码最初是为了满足用户输入的需要,只允许字母数字值(A-Z,A-Z,0-9),我将这些行保留为注释。

            <script>
                jQuery( document ).ready( function() {
    
                    // keydown is used to filter input
                    jQuery( "#formID input" ).keydown( function( e ) {
                        var _key = e.which
                            , _keyCode = e.keyCode
                            , _shifted = e.shiftKey
                            , _altKey = e.altKey
                            , _controlKey = e.ctrlKey
                        ;
                        //console.log( _key + ' ' + _keyCode + ' ' + _shifted + ' ' + _altKey + ' ' + _controlKey );
    
                        if( this.id === jQuery( '#filteredInput' ).prop( 'id' ) ) {
                            if(
                                // BACK,         TAB
                                ( _key === 8 || _key === 9 )    // normal keyboard nav
                            ){}
    
                            else if(
                                // END,           HOME,          LEFT,          UP,            RIGHT,         DOWN
                                ( _key === 35 || _key === 36 || _key === 37 || _key === 38 || _key === 39 || _key === 40 )  // normal keyboard nav
                            ){}
    
                            else if(
                                // DELETE
                                ( _key === 46 ) // normal keyboard nav
                            ){}
    
                            else if(
                                ( _key >= 65 && _key <= 90 )    // a- z
    
                                //( _key >= 48 && _key <=  57 && _shifted !== true ) ||   // 0 - 9 (unshifted)
                                //( _key >= 65 && _key <=  90 ) ||                        // a- z
                                //( _key >= 96 && _key <= 105 )                           // number pad 0- 9
                            ){}
    
                            else {
                                e.preventDefault();
                            }
                        }
    
                    });
                });
            </script>
    
        7
  •  -1
  •   David Mårtensson    14 年前

    我认为keyCode返回ASCII键值,ASCII-104是h。

    http://www.asciitable.com/

    Charcode是另一个答案中提到的一种在某些浏览器中使用的替代方法。

    下面是一篇以crssbrowser为例的文章: http://santrajan.blogspot.com/2007/03/cross-browser-keyboard-handler.html

        8
  •  -1
  •   jqeryandjavascriptarenotthesam    14 年前

    我认为你完全采取了错误的做法。比如说:

    <input id="test">
    
    <script type="text/javascript">
    var aToZ = function(el){
        if(this.value.match(/[^a-zA-Z]/)){
            this.value = this.value.replace(/[^a-zA-Z]+/, '')
        }
    }
    document.getElementById("test").onkeyup = aToZ
    </script>
    

    另外,也不要忘记重复检查服务器端。

    推荐文章