Как я могу получить jquery .val () ПОСЛЕ события нажатия клавиши? - PullRequest
96 голосов
/ 17 июня 2010

Я получил:

$(someTextInputField).keypress(function() {
  alert($(this).val());
});

Теперь предупреждение всегда возвращает значение ДО нажатия клавиши (например, поле пусто, я набираю «а», и предупреждение дает мне »). Затем я набираю« b », и предупреждение дает мне« а » ). Но я хочу значение ПОСЛЕ нажатия клавиши - как я могу это сделать?

Справочная информация. Я хочу включить кнопку, как только текстовое поле содержит хотя бы один символ. Поэтому я запускаю этот тест для каждого события нажатия клавиши, но с помощью возвращенного val () результат всегда на один шаг позади. Использование события change () не вариант для меня, потому что тогда кнопка будет отключена, пока вы не покинете текстовое поле. Если есть лучший способ сделать это, я рад это слышать!

Ответы [ 6 ]

142 голосов
/ 17 июня 2010

Изменить keypress на keyup:

$(someTextInputField).on("keyup", function() {
  alert($(this).val());
});

keypress срабатывает при нажатии клавиши, keyup срабатывает при отпускании клавиши.

54 голосов
/ 07 августа 2014

Удивило, что никто не упомянул событие js "input":

$(someTextInputField).on('input', function() {
  alert($(this).val());
});

Рекомендуется.

https://developer.mozilla.org/en-US/docs/Web/Events/input

9 голосов
/ 17 июня 2010

вместо нажатия клавиши, используйте keyup .

5 голосов
/ 26 января 2014

В качестве альтернативы вы можете использовать событие keydown с таймаутом 0.

Таким образом, изменения будут применены немедленно, а не когда пользователь перестанет удерживать клавишу.

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});
4 голосов
/ 17 июня 2010

Возможно, вы захотите подключить обработчик событий onchange вместо использования каких-либо ключевых событий.

$(someTextInputField).change(function() {
    alert($(this).val());
});

Используя Edit > Paste или щелчок правой кнопкой мыши, вставка вызовет событие изменения,но не ключевое событие.Примечание. некоторые браузеры могут имитировать ключевое событие при вставке (хотя я не знаю ни одного), но вы не можете рассчитывать на такое поведение.

4 голосов
/ 17 июня 2010

Попробуйте что-то вроде этого:

$('#someField').keypress(function() {
  setTimeout(function() {
    if ($('#someField').val().length > 0)
      $('#theButton').attr('disabled', false);
  }, 1);
});

Это просто вводит тайм-аут, так что после завершения цикла события «нажатие клавиши» ваш код будет выполняться почти сразу после этого. Такой короткий интервал таймера (даже если он округлен браузером) не будет заметен.

изменить & mdash; или вы могли бы использовать "keyup", как все говорят, хотя его семантика различна.

...