Получить .val() при нажатии клавиши * не * keyup

#jquery #javascript-events

#jquery #jquery-события

Вопрос:

Я пишу библиотеку, которая изменяет виджет в текстовой области, поэтому мне нужно определить, когда пользователь начинает что-то вводить:

 this.$input.bind('keydown keyup', function() {
    if (this.$input.val() == …) { … }
}
  

.val() Обновляется только при keyup срабатывании. Это слишком большая задержка. Я хочу знать состояние включенного поля ввода keydown . Знаете ли вы библиотеку, которая улучшает .val() ?

Ответ №1:

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

редактировать: существует также событие ввода, которое запускается, как только изменяется ввод (до нажатия клавиши, но после изменения значения);

Комментарии:

1. Поскольку текст поля ввода мгновенно реагирует на ввод с клавиатуры, отложенный ответ моего виджета действительно выделяется.

2. О, это событие HTML5 DOM. Тогда моя работа не будет такой легкой.

Ответ №2:

Единственный способ определить символ в keydown / keypress — это использовать свойство event.keyCode or event.which (где event — объект, передаваемый в качестве первого аргумента функции прослушивателя событий).

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

Ответ №3:

Найдено, казалось бы, идеальное решение. Использует вышеупомянутый HTML5 oninput с onpropertychange резервными вариантами для IE. Блестяще. Фантастика. Другие счастливые слова.

Ответ №4:

Для нажатия клавиши (например, клавиши «a») keydown событие запускается до добавления буквы «a» к вводимому тексту. Вы могли бы определить тип события, и было ли свойство .keyCode события (или .which ) ключом в диапазоне для печати, и попытаться предсказать, что .val() может вернуться после keyup события, но это плохая идея.

 this.$input.bind('keydown keyup', function(e) {
    var val = this.$input.val();

    if (e.type == 'keydown') {
        // Here is where you would check to see if e.keyCode was a printable
        // character.  Note that key codes differ from ASCII codes. For
        // example, the "a" key will return key code 65, which is actually
        // the ASCII code for "A", so you would need to check for the presence
        // of shift keys and such.  Again, this is a bad idea :)
        val  = String.fromCharCode(e.keyCode);
    }

    if (val == …) { … }
}
  

Комментарии:

1. @Matthew: Потому что он вставляет квадратный штифт в круглое отверстие. keydown Событие, по определению, происходит раньше, чем что-либо еще при нажатии клавиши. Это означает, что все, что управляет переводом ключа в текст, еще не успело запуститься. Таким образом, это было бы в основном переопределением этой логики перевода гораздо менее интуитивно понятным и всеобъемлющим образом. Другими словами, вы бы заново изобрели колесо низкого качества.