Я пытаюсь отличить различное использование событий keydown
, keypress
, keyup
, input
, change
в JavaScript.
Если это окно поиска автозаполнения JavaScript, верно ли, что мы должны использовать обработчик событий input
?
Причина такова:
-
обработчик события
change
не будет вызываться до тех пор, пока пользователь не нажмет клавишу Enter или не покинет это поле ввода (клавишей Tab или щелчком вне поля ввода), поэтому событиеchange
не может соответствовать цель сделать предложение, когда пользователь вводит еще один символ в поле ввода. -
Обработчик событий
keydown
может использоваться для "добавления" нажатия клавиши к поисковому запросу, но для CTRL-v или CMD-v (на Mac), чтобы вставить его, мы не можем получитьkeyCode
один за другим, если мы вставим в окно поиска слово, такое какhello
, потому что для CTRL и одного нажатия клавиши дляv
вместоhello
будет только одно нажатие клавиши, но мы можем используйте атрибут вводаvalue
для получения значения - однако, что, если пользователь использует мышь для правого клика и выбирает "вставить", чтобы добавить текст в поле - в этом случае мы должны или можем использовать обработчик события мыши, чтобы посмотреть на атрибутvalue
? Это слишком грязно, чтобы иметь дело с таким низким уровнем клавиатуры и мыши.
Таким образом, обработчик события input
, по-видимому, точно соответствует точному назначению, потому что будет изменяться любое значение, обработчик события input
будет вызван. И почему обработчик событий input
может быть важным и полезным.
Нам еще нужен обработчик событий keydown
, потому что если пользователь нажимает клавишу со стрелкой вниз, чтобы перейти в список возможных элементов? (и, возможно, ESC, чтобы окно подсказки автозаполнения исчезло). В этих случаях обработчик события input
и обработчик события change
не будут вызываться, а событие keydown
будет полезно для этих случаев.
Является ли приведенная выше концепция правильной, главным образом для понимания события input
?
(jsfiddle для понимания того, какие вызовы обработчиков событий: http://jsfiddle.net/jYsjs/)