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

如何知道.keyup()是否是字符键(jQuery)

  •  62
  • faressoft  · 技术社区  · 14 年前

    如何知道.keyup()是否是字符键(jQuery)

    $("input").keyup(function() {
    
    if (key is a character) { //such as a b A b c 5 3 2 $ # ^ ! ^ * # ...etc not enter key or shift or Esc or space ...etc
    /* Do stuff */
    }
    
    });
    
    7 回复  |  直到 14 年前
        1
  •  46
  •   HankScorpio    5 年前

    注: 事后看来,这是一个又快又脏的回答,可能在所有情况下都不管用。要获得可靠的解决方案,请参见 Tim Down's answer (复制粘贴到此处,因为此答案仍在获取意见和赞成票):

    关于输入的字符,您必须使用 而是按键事件。

    下面的例子在大多数浏览器中都可以使用,但是 有一些边缘的情况,你应该知道。为了什么 http://unixpapa.com/js/key.html .

    $("input").keypress(function(e) {
        if (e.which !== 0) {
            alert("Character was typed. It was: " + String.fromCharCode(e.which));
        }
    });
    

    keyup keydown 提供有关物理密钥的信息 被压住了。在美国/英国标准键盘的标准布局中 看起来在 keyCode 财产 这些事件和它们所代表的性格。然而,这不是


    以下是原始答案,但不正确,可能无法在所有情况下可靠工作。

    将键码与字字符匹配(例如。, a 会匹配的。 space

    $("input").keyup(function(event)
    { 
        var c= String.fromCharCode(event.keyCode);
        var isWordcharacter = c.match(/\w/);
    }); 
    

    好吧,那是个很快的回答。方法是相同的,但是要注意键码问题,请参见 article 在怪癖模式下。

        2
  •  101
  •   Tim Down    12 年前

    keyup 事件。 keypress 而是事件。

    下面的示例在大多数浏览器中都可以正常工作,但是有一些边缘情况需要注意。在我看来,这方面的权威指南是什么,请参见 http://unixpapa.com/js/key.html .

    $("input").keypress(function(e) {
        if (e.which !== 0) {
            alert("Charcter was typed. It was: " + String.fromCharCode(e.which));
        }
    });
    

    keydown keyCode 这些事件的属性及其所代表的角色。但是,这是不可靠的:不同的键盘布局将有不同的映射。

        3
  •  14
  •   Mike Doe Backs    5 年前

    我对其他的答案并不完全满意。他们都有缺点。

    使用 keyPress 具有 event.which 是不可靠的,因为您不能捕捉退格或删除(如Tarl所述)。 使用 keyDown (就像Niva和Tarl的答案)要好一点,但是解决方案有缺陷,因为它试图使用 event.keyCode String.fromCharCode() (keyCode和charCode不一样!)。

    keydown keyup 事件是实际按下的键( event.key ). key 长度为1的字符(数字或字母)与您使用的键盘语言无关。如果那不是真的,请纠正我!

    那么asdf的回答很长。这也许很有效,但似乎有点过头了。


    弹起 键盘按下 keypress 不会)

    $("input").keydown(function(event) {
    
        var isWordCharacter = event.key.length === 1;
        var isBackspaceOrDelete = event.keyCode === 8 || event.keyCode === 46;
    
        if (isWordCharacter || isBackspaceOrDelete) {
            // do something
        }
    });
    
        4
  •  11
  •   HankScorpio    8 年前

    这对我有帮助:

    $("#input").keyup(function(event) {
            //use keyup instead keypress because:
            //- keypress will not work on backspace and delete
            //- keypress is called before the character is added to the textfield (at least in google chrome) 
            var searchText = $.trim($("#input").val());
    
            var c= String.fromCharCode(event.keyCode);
            var isWordCharacter = c.match(/\w/);
            var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46);
    
            // trigger only on word characters, backspace or delete and an entry size of at least 3 characters
            if((isWordCharacter || isBackspaceOrDelete) && searchText.length > 2)
            { ...
    
        5
  •  4
  •   bla    14 年前

    如果你只需要排除 enter escape spacebar

    $("#text1").keyup(function(event) {
    if (event.keyCode != '13' && event.keyCode != '27' && event.keyCode != '32') {
         alert('test');
       }
    });
    

    See it actions here.

    你可以参考 complete list of keycode here 为了你的进一步修改。

        6
  •  4
  •   asdf    12 年前

    二者都 这个 以及 按键 事件。

    (我没有在所有浏览器中测试过它,但是我使用了 http://unixpapa.com/js/key.html

    编辑:将其重写为jQuery插件。

    (function($) {
        $.fn.normalkeypress = function(onNormal, onSpecial) {
            this.bind('keydown keypress keyup', (function() {
                var keyDown = {}, // keep track of which buttons have been pressed
                    lastKeyDown;
                return function(event) {
                    if (event.type == 'keydown') {
                        keyDown[lastKeyDown = event.keyCode] = false;
                        return;
                    }
                    if (event.type == 'keypress') {
                        keyDown[lastKeyDown] = event; // this keydown also triggered a keypress
                        return;
                    }
    
                    // 'keyup' event
                    var keyPress = keyDown[event.keyCode];
                    if ( keyPress &&
                         ( ( ( keyPress.which >= 32 // not a control character
                               //|| keyPress.which == 8  || // \b
                               //|| keyPress.which == 9  || // \t
                               //|| keyPress.which == 10 || // \n
                               //|| keyPress.which == 13    // \r
                               ) &&
                             !( keyPress.which >= 63232 && keyPress.which <= 63247 ) && // not special character in WebKit < 525
                             !( keyPress.which == 63273 )                            && //
                             !( keyPress.which >= 63275 && keyPress.which <= 63277 ) && //
                             !( keyPress.which === event.keyCode && // not End / Home / Insert / Delete (i.e. in Opera < 10.50)
                                ( keyPress.which == 35  || // End
                                  keyPress.which == 36  || // Home
                                  keyPress.which == 45  || // Insert
                                  keyPress.which == 46  || // Delete
                                  keyPress.which == 144    // Num Lock
                                  )
                                )
                             ) ||
                           keyPress.which === undefined // normal character in IE < 9.0
                           ) &&
                         keyPress.charCode !== 0 // not special character in Konqueror 4.3
                         ) {
    
                        // Normal character
                        if (onNormal) onNormal.call(this, keyPress, event);
                    } else {
                        // Special character
                        if (onSpecial) onSpecial.call(this, event);
                    }
                    delete keyDown[event.keyCode];
                };
            })());
        };
    })(jQuery);
    
        7
  •  0
  •   lordlouis    6 年前

    我从不喜欢密钥代码验证。我的方法是查看输入是否有文本(任何字符),确认用户输入的是文本而不是其他字符

    $('#input').on('keyup', function() {
        var words = $(this).val();
        // if input is empty, remove the word count data and return
        if(!words.length) {
            $(this).removeData('wcount');
            return true;
        }
        // if word count data equals the count of the input, return
        if(typeof $(this).data('wcount') !== "undefined" && ($(this).data('wcount') == words.length)){
            return true;
        }
        // update or initialize the word count data
        $(this).data('wcount', words.length);
        console.log('user tiped ' + words);
        // do you stuff...
    });
    <html lang="en">
      <head>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      </head>
      <body>
      <input type="text" name="input" id="input">
      </body>
    </html>