Отслеживание изменений в текстовом инпуте на JavaScript
Быстрый ответ
Для реального отслеживания изменений применяется событие input
на элементах <input>
.
document.querySelector('#input').addEventListener('input', function(event) {
console.log(event.target.value);
});
Этот код зарегистрирует каждое действие вроде ввода текста, удаления или вставки—моментально.
oninput
против onchange
: почему выбор важен
Событие input
отличается от onchange
. Последнее срабатывает, когда элемент теряет фокус, в то время как input
реагирует на каждое действие моментально. Это обеспечивает непосредственную обратную связь, необходимую для интерфейсов, где требуется проверка, форматирование или фильтрация текста «на лету».
Для устаревших версий Internet Explorer применение событий oninput
и onpropertychange
давало схожие результаты. Сейчас же предпочтительнее следовать стандартам WHATWG HTML для обеспечения кроссбраузерной совместимости.
Визуализация
Представьте, что каждое нажатие клавиши в поле ввода — это нота в музыкальной композиции:
Поле ввода: [🎶]
Событие input
"прислушивается" к этой мелодии:
inputField.addEventListener('input', function() {
console.log('Прозвучала нота: 🎵');
});
С каждой нотой (нажатием клавиши) оркестр взаимодействия с пользователем доставляет нам мгновенные изменения:
| Нажатие клавиши | Событие сработало |
| ---------------- | ---------------- |
| А | 🎵 |
| п | 🎵 |
| п | 🎵 |
| л | 🎵 |
| е | 🎵 |
Обработка исключительных ситуаций и создание универсальных решений
Обеспечение обратной совместимости
Если вам нужена максимальная совместимость, используйте подход поэтапного ухудшения для поддержки старых браузеров. Даже если они не могут воспользоваться всеми функциями, базовая функциональность должна быть сохранена.
let inputElement = document.querySelector('input');
let inputEventHandler = function(event) {
console.log(event.target.value); // 👀 фиксируем ввод пользователя
};
if (inputElement.oninput === undefined) {
// Старый добрый IE?
inputElement.onpropertychange = inputEventHandler;
} else {
inputElement.oninput = inputEventHandler;
}
Этот код проверяет поддержку события input
. Если ее нет, то используется onpropertychange
.
Оптимизация отслеживания событий вставки
Важно учитывать вставку текста без его непосредственного ввода пользователем.
inputElement.addEventListener('paste', function(event) {
// Тяжело ждать. Так считал Том Петти!
setTimeout(() => console.log(inputElement.value), 0);
});
Применение события onpaste
вместе с минимальной задержкой setTimeout
позволяет отследить отображение вставленного текста в поле ввода.
Повышение производительности с дебаунсингом
Частый и многократный ввод может снижать производительность. Используйте дебаунсинг для оптимизации – задержку выполнения функции до момента, когда пользователь прекратит ввести текст.
let debounce = function(func, delay) {
let inDebounce;
return function() {
clearTimeout(inDebounce);
inDebounce = setTimeout(() => func.apply(this, arguments), delay);
};
};
inputElement.addEventListener('input', debounce(function(event) {
console.log(event.target.value);
}, 250));
Эта техника обеспечивает, что обработчик событий будет активирован только после короткого периода времени, который следует за остановкой ввода, тем самым освобождая системные ресурсы.
Устранение несоответствий работы с <textarea>
в Safari
Для элементов <textarea>
в Safari cобытие input
может работать неправильно. Вместо него используйте событие textInput
:
let textAreaElement = document.querySelector('textarea');
textAreaElement.addEventListener('textInput', function(event) {
console.log(event.data);
});
Это дает точный контроль за текстовым вводом и верно отслеживает изменения.
Полезные материалы
- Событие Input – Веб-API | MDN – Подробное руководство по использованию события input.
- Дебаунсинг и троттлинг на примерах | CSS-Tricks – Различия и способы реализации дебаунсинга и троттлинга.
- Введение в события JavaScript – Основы работы с событиями в JavaScript.
- Делегирование событий – Примеры и преимущества делегирования событий.
- jQuery: Как создать событие в текстовом поле, когда я закончил писать? – Stack Overflow – Решения от сообщества по отслеживанию изменений ввода.
- Debounce: Как отложить исполнение функции в JavaScript – Подробно о дебаунсинге и вариациях.
- HTML Стандарт – Официальная спецификация HTML для события input и связанных элементов.