Як я можу отримати jquery .val () ПІСЛЯ події натискання клавіші?


101

Я отримав:

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

Тепер попередження завжди повертає значення ПЕРЕД ПІД натисканням клавіші (наприклад, поле порожнє, я набираю "a", і попередження дає мені ". Потім я набираю" b ", і попередження дає мені" a "...). Але я хочу, щоб значення ПІСЛЯ натискання клавіші - як це зробити?

Фон: Я б хотів увімкнути кнопку, як тільки текстове поле містить хоча б один символ. Тому я запускаю цей тест на кожній події натискання клавіш, але за допомогою повернутого val () результат завжди відстає на крок. Використання події change () не є для мене варіантом, тому що тоді кнопку вимкнено, поки ви не залишите текстове поле. Якщо є кращий спосіб зробити це, я радий це почути!


Чи слід знову відключити кнопку, якщо текст видалено? Якщо так, вам, ймовірно, доведеться дотримуватися натискання клавіш.
Brilliand

Відповіді:


152

Змінити keypressна keyup:

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

keypressзапускається при натисканні клавіші, keyupзапускається при відпуску ключа.


@Brilliand Ви маєте рацію. Я зробив вирішення цього питання, це розміщено нижче.
Девід Оліверос

7
як ти кому це досягаєш на пристроях iPhone / Android? Вони не підтримують функцію клавіші.
Merijn Den Houting

4
визначення клавіші не зовсім правильне. ось визначення клавіатури. см quirksmode.org/dom/events/keys.html
Challet

59

Здивовано, що ніхто не згадував подію js "input":

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

Рекомендовано

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


8
Нічого собі, це відповідь на кілька питань без відповіді / поганого відповіді.
Бен Рачикот

4
Це також чудово, коли вам потрібно ігнорувати натискання клавіш зі стрілками, зміщення тощо у полі введення.
Ховадо

2
caniuse.com/#search=input Відносно хороша підтримка браузера. Набагато краща відповідь, ніж прослуховування кожної клавіатури.
Джеймс Хауг

1
Це рятує мій день! Дякую. Я використав наступний код: $ ('. Subject_mark'). On ("вхід", функція () {var $ th = $ (це); $ th.val ($ th.val (). Замінити (/ [^ 0-9] / g, function (str) {return '';}));
arsho


5

Крім того, ви можете використовувати подію клавіш із затримкою 0.

Таким чином, зміни будуть застосовані миттєво, замість того, щоб застосувати, коли користувач перестане утримувати клавішу.

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

Це все ще дивно поводитиметься у випадку утримування Backspace ... можливо, натискання клавіші із затримкою 0?
Brilliand

Ах, неважливо, в ОП не вказано, що повинно статися, якщо текстове поле буде очищене.
Brilliand

4

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

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

Використовуючи Edit > Pasteабо клацніть правою кнопкою миші, тоді Вставити запустить подію зміни, але не ключову подію. Зауважте, деякі браузери можуть імітувати ключову подію на пасті (хоча я не знаю жодної), але ви не можете розраховувати на таку поведінку.


4

Спробуйте щось подібне:

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

Це просто вводить тайм-аут, так що після завершення циклу подій "натискання клавіші" ваш код буде запускатися майже відразу після цього. Такий короткий інтервал таймера (навіть якщо округлюється браузером) не буде помітний.

редагувати - або ви можете використовувати "клавіатуру", як говорять усі, хоча її семантика відрізняється.


Це не питання benig розумний . Подія клавіатури не дає однакового результату. Ви отримуєте чіткі події для shift, ctrl тощо тощо за допомогою клавіші - якщо ви хочете, щоб фактичний символ вводився (наприклад, амперсанда), а не ряд ключових подій, які вам доведеться перевірити стан зрушення або клавіші ctrl, натискання клавіш це шлях.
Рипсайд

1
Правильно; це те, що я мав на увазі під "семантикою це різне".
Pointy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.