Как я могу получить jquery.val () после события нажатия клавиши?


Я:

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

теперь предупреждение всегда возвращает значение перед нажатием клавиши (например, поле пусто, я набираю "a", и предупреждение дает мне". Затем я набираю "b", и предупреждение дает мне "a"...). Но я хочу значение после нажатия клавиши - как я могу это сделать?

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

6 93

6 ответов:

изменить keypress to keyup:

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

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

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

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

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

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

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

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

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

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});

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

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

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

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

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

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

edit - или может используйте "keyup", как все говорят, хотя его семантика отличается.