У меня есть обычное текстовое поле:
<input type="text">
Я использую jQuery для обработки событий, связанных с ключами:
$("input:text").keydown(function() {
// keydown code
}).keypress(function() {
// keypress code
}).keyup(function() {
// keyup code
});
Пользователь фокусируется на текстовом поле и нажимает различныеклавиши на клавиатуре (обычные: буквы, цифры, SHIFT, BACKSPACE, SPACE, ...).Мне нужно определить, когда пользователь нажимает клавишу, чтобы увеличить длину значения текстового поля.Например, клавиша «A» увеличит его, клавиша «SHIFT» не увеличит.
Я помню, как смотрел лекцию ППК, где он упомянул разницу между этими двумя.Это как-то связано с событием - keydown vs. keypress - и, возможно, со свойствами события - key, char, keyCode.
Обновление!
Мне нужно знать эту информацию в обработчиках нажатия клавиш или нажатия клавиш.Я не могу дождаться события keyup.
Зачем мне это нужно:
У меня есть текстовое поле, размер которого динамически изменяется в зависимости от ввода пользователя.Вы можете взглянуть на это демо: http://vidasp.net/tinydemos/variable-size-text-box.html
В демоверсии у меня есть обработчик нажатия клавиш и нажатия клавиш.Обработчик keyup регулирует размер текстового поля на основе введенного значения.Однако обработчик нажатия клавиш устанавливает размер на 1 символ больше входного значения.Причина, по которой я это делаю, заключается в том, что если бы я этого не сделал, то символ переполнялся бы за пределами текстового поля, и только когда пользователь отпустил клавишу, текстовое поле расширилось бы.Это выглядит странно.Вот почему я должен предвидеть нового персонажа - я увеличиваю текстовое поле при каждом нажатии клавиши, т.е. до того, как символ появляется в текстовом поле.Как вы можете видеть в демоверсии, этот метод выглядит великолепно.
Однако проблема заключается в клавишах BACKSPACE и ARROW - они также расширяют текстовое поле при нажатии клавиши, и только при включении клавиши размер текстового поля будет исправлен.
Обходной путь:
Обходным способом будет обнаружение клавиш BACKSPACE, SHIFT и ARROW вручную и действие на основечто:
// keydown handler
function(e) {
var len = $(this).val().length;
if (e.keyCode === 37 || e.keyCode === 39 ||
e.keyCode === 16) { // ARROW LEFT or ARROW RIGHT or SHIFT key
return;
} else if (e.keyCode === 8) { // BACKSPACE key
$(this).attr("size", len <= 1 ? 1 : len - 1);
} else {
$(this).attr("size", len === 0 ? 1 : len + 1);
}
}
Это работает (и выглядит отлично) для BACKSPACE, SHIFT, СТРЕЛКА ВЛЕВО и СТРЕЛКА ВПРАВО.Однако мне бы хотелось иметь более надежное решение.