Ответ 1
У вас это в основном правильное, вот подробный обзор событий и потенциальных случаев ввода.
События JavaScript
Это когда срабатывает другое событие:
-
change
Это будет вызываться, когда событие
blur
запускается, если значение<input>
было изменено. Другими словами, он будет срабатывать, когда вход теряет фокус, а значение отличается от того, что было. -
input
Событие
input
- это в основном все, что вы ищете, оно захватывает событие при любых изменениях ввода и, скорее всего, вызвано причинами головных болей при разработке чего-то, что следит за каждым нажатием клавиши. Событие ввода даже удается поймать случай, когда мышь вставляется в контент.К сожалению, событие
input
является относительно новым и доступно только для современных браузеров (IE9 +). -
keydown
Событие
keydown
довольно просто, оно срабатывает, когда пользователь нажимает клавишу вниз. -
keypress
Событие
keypress
должно отображать набранный символ. Из-за этого он не захватывает backspace или delete, который немедленно отклоняет его для использования черезkeydown
. -
keyup
Во многом как
keydown
, он запускается всякий раз, когда пользователь отпускает ключ. -
paste
Это удобное событие запускается, когда данные вставляются в элемент.
Клавиши-модификаторы
Обратите внимание, что keydown
, keypress
и keyup
содержат информацию о ключах-модификаторах Ctrl, Shift и Alt в свойствах ctrlKey
, shiftKey
и altKey
соответственно.
Случаи
Вот список случаев, которые вам необходимо рассмотреть:
-
Ввод ввода с клавиатурой (включая нажатие клавиши)
Триггеры:
keydown
,keypress
,input
,keyup
-
Удаление ввода (Backspace/Delete)
Триггеры:
keydown
,input
,keyup
-
Вставка с использованием Ctrl + V
Триггеры:
keydown
,paste
,input
,keyup
-
Использование мыши для вставки
Триггеры:
paste
,input
-
Выберите элемент из автозаполнения (↑/↓)
Триггеры:
keydown
,keyup
Реализация
Учитывая вышеизложенное, вы можете реализовать свой блок автозаполнения, обрабатывающий событие input
для всех изменений ввода, а затем keydown
для обработки вверх и вниз. Это действительно отлично разделило бы все и привело бы к довольно чистому коду.
Если вы хотите поддерживать IE8, вам нужно выбросить все, кроме вставки в событие keydown
, а затем обработать paste
. Событие paste
довольно широко поддерживается сейчас и находится в IE с версии v5.5).
Экспериментирование с событиями
Вот jsFiddle, который я использовал для тестирования событий, вам может показаться полезным. Он показывает немного больше информации о каждом событии:
function logEvent(e) {
console.log(e.type +
"\n this.value = '" + this.value + "'" +
(e.keyCode ? "\n e.keyCode = '" + e.keyCode + "'" : "") +
(e.keyCode ? "\n char = '" + String.fromCharCode(e.keyCode) + "'" : ""));
console.log(e);
}