События клавиатуры jQuery

Используя jQuery, я хотел бы захватить событие клавиатуры, которое:

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

Чтобы прояснить, просмотрите этот пример. Когда keypress срабатывает, значение input еще не обновлено.

[изменить]

По-видимому, я не понимал, что мне нужно.

Функция должна быть вызвана до, пользователь поднимает свой палец вверх от клавиши, но после ключевой символ помещается в поле ввода. Таким образом, следующее не работает:

  • keydown: в событии keypress значение в текстовом поле не обновлено
  • keypress: при событии keypress значение в текстовом поле не обновлено
  • keyup: это вызывается, когда пользователь поднимает палец, что слишком поздно.

Ответ 1

Вы можете использовать событие input, которое работает в последних версиях всех основных браузеров:

var input = document.getElementById("your_input_id");
input.oninput = function() {
    alert(input.value);
};

К сожалению, это не работает в IE <= 8. Однако в тех браузерах, вы можете использовать propertychange событие на value недвижимости, а не:

input.onpropertychange = function() {
    if (window.event.propertyName == "value") {
        alert(input.value);
    }
};

Так, обычный ответчик JavaScript @Andy E подробно рассказал об этом в своем блоге: https://web.archive.org/web/20140626060232/http://whattheheadsaid.com/2011/10/update-html5-oninput-event- плагин-для-JQuery

Ответ 2

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

UPDATE:

Хорошо, я неправильно понял ваши требования, но нет события, которое бы соответствовало вашим потребностям. Единственное, что я могу придумать для моделирования этого поведения, это следующее:

  • слушать keydown/keypress
  • получить значение из объекта event (получить event.which, а затем преобразовать его в фактическое значение)
  • используйте переменную, как я упоминал в первоначальном совете, и присоединяю к ней новый вход.

Вот скрипка: http://jsfiddle.net/HpXuU/13/

Это, очевидно, не идеальное решение, так как для этого нужно какое-то (можно было бы утверждать, что это не так) работу. Я бы посоветовал переосмыслить ваши потребности, но если это поведение абсолютно необходимо, я думаю, что это шаг в правильном направлении.

Ответ 3

Используйте событие keyup, пример jsFiddle

$("textarea").keyup(function(e){
   alert($(this).val());
});

Это происходит после того, как вы поднимаете ключ. Я не знаю, чего вы хотите достичь, но вы можете сохранить состояние перед тем, как поднять ключ (на keydown или keypress) и при необходимости восстановить позже. Вы также можете остановить вывод в событии keyup, используя e.preventDefault(), поэтому даже после того, как ключ поднят, он не будет регистрировать значения в области.

Ответ 4

Вы можете использовать setTimeout:

$('input').keypress(function() {
    var that = this;
    setTimeout(function() {
        // read that.value
    }, 0);
});

Живая демонстрация: http://jsfiddle.net/HpXuU/8/