#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
Событие, по определению, происходит раньше, чем что-либо еще при нажатии клавиши. Это означает, что все, что управляет переводом ключа в текст, еще не успело запуститься. Таким образом, это было бы в основном переопределением этой логики перевода гораздо менее интуитивно понятным и всеобъемлющим образом. Другими словами, вы бы заново изобрели колесо низкого качества.