[javascript] Как узнать, является ли .keyup () символьным ключом (jQuery)



Answers

Вы не можете сделать это надежно с событием 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));
    }
});

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

Question

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

});



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

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

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

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

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

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

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

    if (isWordCharacter || isBackspaceOrDelete) {

    }
});



Я хотел сделать именно это, и я подумал о решении, включающем как keyup, так и события нажатия клавиш .

(Я не тестировал его во всех браузерах, но я использовал информацию, собранную по адресу 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);



Related