68

如何知道 .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 */
}

});
4

7 回答 7

103

您无法通过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));
    }
});

keyupkeydown为您提供有关按下的物理键的信息。keyCode在标准布局中的标准美式/英式键盘上,这些事件的属性与它们所代表的字符之间似乎存在相关性。然而,这并不可靠:不同的键盘布局会有不同的映射。

于 2010-10-20T13:19:59.550 回答
46

注意:事后看来,这是一个快速而肮脏的答案,可能不适用于所有情况。要获得可靠的解决方案,请参阅Tim Down 的答案(在此处复制粘贴,因为此答案仍在获得意见和支持):

你不能用 keyup 事件可靠地做到这一点。如果您想了解有关输入字符的信息,则必须改用 keypress 事件。

以下示例在大多数浏览器中始终有效,但您应该注意一些边缘情况。对于我认为这方面的权威指南,请参阅 http://unixpapa.com/js/key.html

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

keyupkeydown为您提供有关按下的物理键的信息。keyCode在标准布局中的标准美式/英式键盘上,这些事件的属性与它们所代表的字符之间似乎存在相关性。然而,这并不可靠:不同的键盘布局会有不同的映射。


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

将键码与单词字符匹配(例如,a会匹配。space不会)

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

好的,这是一个快速的答案。方法是一样的,但要注意 keycode 问题,请参阅 quirksmode 中的这篇文章

于 2010-10-20T12:37:49.627 回答
16

我对给出的其他答案并不完全满意。他们都有某种缺陷。

使用keyPresswithevent.which是不可靠的,因为您无法捕获退格或删除(如 Tarl 所述)。使用keyDown(如 Niva 和 Tarl 的答案)要好一些,但该解决方案存在缺陷,因为它尝试使用event.keyCodewith String.fromCharCode()(keyCode 和 charCode 不一样!)。

但是,我们对keydownorkeyup事件所做的是实际按下的键 ( event.key)。据我所知,任何key长度为 1 的字符都是字符(数字或字母),无论您使用哪种语言键盘。如果这不是真的,请纠正我!

然后是 asdf 的很长的回答。这可能完美无缺,但似乎有点矫枉过正。


所以这是一个简单的解决方案,可以捕获所有字符、退格和删除。(注意:要么keyupkeydown将在这里工作,但keypress不会)

$("input").keydown(function(event) {

    var isWordCharacter = event.key.length === 1;
    var isBackspaceOrDelete = event.keyCode === 8 || event.keyCode === 46;

    if (isWordCharacter || isBackspaceOrDelete) {
        // do something
    }
});
于 2016-10-20T19:13:48.427 回答
11

这对我有帮助:

$("#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)
        { ...
于 2012-09-20T10:50:06.393 回答
4

如果您只需要排除 outenter和键escapespacebar您可以执行以下操作:

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

在这里查看它的操作。

您可以在此处参考完整的键码列表以进行进一步修改。

于 2010-10-20T12:31:26.713 回答
4

我想做到这一点,我想到了一个涉及keyupkeypress事件的解决方案。

(我没有在所有浏览器中测试过,但是我使用了在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);
于 2012-07-20T22:52:51.843 回答
0

我从不喜欢关键代码验证。我的方法是查看输入是否有文本(任何字符),确认用户正在输入文本并且没有其他字符

$('#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>

于 2018-10-26T16:15:14.567 回答