Событие keyup всегда возвращает прописную букву

Я пытаюсь написать что-то похожее на "placeholder" polyfill. Я хотел бы поймать событие keyup в поле ввода и получить char введенный пользователем, поэтому у меня есть этот код:

 $elem.on('keyup',function(e){  
    var $this = $(this),    
        val = $this.val(),
        code = (e.keyCode ? e.keyCode : e.which);
    console.log(String.fromCharCode(code));

});

Проблема заключается в том, что это всегда возвращает версию в верхнем регистре нажатого char, как я могу узнать, был ли нажатый char прописным или строчным?

Я знаю, что keypress дает нажатый char, но он не активируется во всех событиях нажатия клавиш (например, backspace).

Ответы

Ответ 1

Вы не можете легко получить эту информацию из keyup, потому что keyup знает только, какие клавиши нажаты, а не какие буквы набираются. Вы можете проверить, что клавиша смены недоступна, и вы также можете попытаться отследить блокировку блокировки самостоятельно, но если кто-то нажал ее за пределы браузера, вы получите неправильные символы.

Вы можете попробовать событие нажатия., хотя отчеты jQuery не всегда ведут один и тот же кросс-браузер. Из документа:

Обратите внимание, что keydown и keyup предоставляют код, указывающий, какой ключ нажатие, а нажатие клавиши указывает, какой символ был введен. Для Например, нижний регистр "a" будет отображаться как 65 с помощью keydown и keyup, но как 97 нажатием клавиши. В верхнем регистре "А" сообщается как 65 Мероприятия. Из-за этого различия при попадании специальных нажатий клавиш такие как клавиши со стрелками,.keydown() или .keyup() - лучший выбор.

Ответ 2

keyup знает только нажатие клавиши, а не дополнительные условия (в этом случае, если это нижний/верхний регистр). Попробуйте вместо этого событие keypress (я использовал документ для демонстрационного примера - изменил его на необходимый элемент)

например:

<script type="text/javascript">

$(document).on('keypress',function(e) {  
    var $this = $(this),    
        val = $this.val(),
        code = e.keyCode || e.which;
    console.log(String.fromCharCode(code));
});

</script>

Ответ 3

Вам нужно будет зафиксировать ключевое событие onkeypress, чтобы вы могли получить доступ к коду символов. Даже если вы хотите обнаружить каплок/сдвиг + нажатие клавиши, оно все равно будет регистрироваться как два отдельных нажатия клавиш, что затрудняет определение верхнего строчка vrs.

Некоторые важные заметки KeyCode:

"Будьте внимательны при доступе к свойству keyCode во время события onkeydown или onkeyup, поскольку оно устанавливается при нажатии любой клавиши, включая клавиши без символов, такие как" Shift ". Это означает, что если вы попытаетесь нажать" Shift + a "на попробуйте и получите keyCode для" A ", вы всегда получите два keyCodes, один для" Shift "и один для" A "в этом порядке. То, что вы не получите, это keyCode для" a ", поскольку keyCode всегда возвращает значение unicode в верхнем регистре символа. Чтобы получить keyCode для" a "(нижний регистр), вы должны исследовать keyCode, возвращенный во время события onkeypress в IE, и поскольку Firefox не устанавливает keyCode во время onkeypress, переключитесь на e.charCode или e.which для этого браузера."

Некоторые важные примечания к CharCode:

"Возвращает код символа клавиши, нажатой во время события onkeypress, и устанавливается только для ключей, с которыми связан символ (т.е.:" a "," b "или" z "). никакая ассоциация символов, такая как" Shift "или" Ctrl", не подходит. Другие пункты:  - Для символов верхнего и нижнего регистра возвращаются разные значения (например: "a" в сравнении с "A" ).

Вот отличный источник, из которого пришли две цитаты, из которых, скорее всего, помогут вам в дальнейшей путанице.

Клавиши и чарккоды

Ответ 4

Вы можете получить charcode в событии keypress, а для "backspace", "insert" и т.д. вы можете использовать свойство keydowns keyCode.