Как узнать, если.keyup () - это символьный ключ (jQuery)


Как узнать, если .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 */
}

});
6 59

6 ответов:

Примечание: в ретроспективе это был быстрый и грязный ответ, и может не работать во всех ситуациях. Чтобы иметь надежное решение, см. ответ Тима Дауна (скопируйте вставку, что здесь, поскольку этот ответ все еще получает представления и upvotes):

вы не можете сделать это надежно событие keyup. Если вы хотите знать что-то о символе, который был набран, вы должны использовать вместо этого событие нажатия клавиши.

следующий пример будет работать все время в большинстве браузеров, но есть некоторые крайние случаи, о которых вы должны знать. За то, что находится внутри мой взгляд полное руководство по этому вопросу см. http://unixpapa.com/js/key.html.

$("input").keypress(function(e) {
    if (e.which !== 0) {
        alert("Charcter 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/);
}); 

ок, это был быстрый ответ. Подход тот же, но остерегайтесь проблем с кодом ключа, смотрите это статьи в quirksmode.

вы не можете сделать это надежно с keyup событие. если вы хотите узнать что-то о символе, который был введен, вы должны использовать событие.

следующий пример будет работать все время в большинстве браузеров, но есть некоторые крайние случаи, о которых вы должны знать. Что, на мой взгляд, является окончательным руководством по этому вопросу, см. http://unixpapa.com/js/key.html.

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

keyup и keydown даст вам информация о физической клавише, которая была нажата. На стандартных клавиатурах США / Великобритании в их стандартных макетах, похоже, существует корреляция между keyCode свойство этих событий и персонажей, которых они представляют. Однако это ненадежно: разные раскладки клавиатуры будут иметь разные сопоставления.

это помогло мне:

$("#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)
        { ...

Я не полностью удовлетворен другими данными ответами. У них у всех есть какой-то недостаток.

используя keyPress С event.which ненадежно, потому что вы не можете поймать backspace или delete (как упоминалось Tarl). Используя keyDown (как в ответах Нивы и Тарла) немного лучше, но решение испорчено, потому что оно пытается использовать event.keyCode С String.fromCharCode() (keyCode и charCode-это не одно и то же!).

однако, что мы имеем с keydown или keyup событие-это фактическая клавиша, которая была нажата (event.key). Насколько я могу судить, любой key длиной 1 символ (цифра или буква) независимо от того, какой язык вы используете. Пожалуйста, поправьте меня, если это не так!

тогда есть очень длинный ответ от asdf. Это может работать отлично, но это кажется излишним.


Итак, вот простое решение, которое будет ловить все символы, backspace и delete. (Примечание: либо keyup или keydown будет работать здесь, но keypress не будет)

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

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

    if (isWordCharacter || isBackspaceOrDelete) {

    }
});

Если вам нужно только исключить enter,escape и spacebar ключи, вы можете сделать следующее:

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

увидеть его действия.

вы можете обратиться к полный список вот код для дальнейшей модификации.

Я хотел сделать именно это, и я думал о решении с участием и the keyup и нажатие событий.

(Я не проверял его во всех браузерах, но я использовал информацию, собранную в http://unixpapa.com/js/key.html)

Edit: переписал его как плагин 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);