W3docs

События JavaScript change, input, cut, copy, paste

Обработка событий JavaScript необходима для создания динамичных веб-приложений. Статья охватывает события change, input, cut, copy и paste.

Понимание и реализация обработки событий JavaScript необходимы для создания динамичных и удобных для пользователя веб-приложений. Эта статья посвящена ключевым событиям, связанным с полями формы и взаимодействием с пользователем: change, input, cut, copy и paste. Освоив эти события, вы сможете улучшить опыт ввода данных и предоставлять немедленную обратную связь в веб-формах.

На этой странице рассматривается, что делает каждое событие, точно когда оно срабатывает, чем отличаются change и input, а также как читать данные буфера обмена и управлять ими — с примерами, которые можно запустить, для каждого случая.

change vs input: краткий обзор

Два события, связанных с текстом, легко перепутать. Они различаются по времени срабатывания:

СобытиеСрабатывает когда…Типичное применение
changeЗначение зафиксировано — обычно когда элемент теряет фокус (для <select> — немедленно при выборе; для флажка/радиокнопки — немедленно при переключении)Финальная валидация, сохранение значения
inputКаждое изменение значения — каждое нажатие клавиши, вставка или программное изменение в процессе редактированияЖивой предпросмотр, валидация в реальном времени, счётчик символов

Коротко: input — «по мере набора», change — «когда закончили».

Использование события change

Событие change срабатывает, когда значение элемента <input> или <textarea> изменяется и элемент впоследствии теряет фокус (blur). Для элемента <select>, флажка или радиокнопки оно срабатывает немедленно при изменении выбора или состояния флажка, поскольку у них нет промежуточного состояния набора, которое нужно фиксировать. Это событие идеально подходит для выполнения валидации или других действий после того, как ввод пользователя завершён.

Пример: отслеживание изменений в Select

<select id="colorSelector">
  <option value="red">Red</option>
  <option value="blue">Blue</option>
  <option value="green">Green</option>
</select>
<script>
  document.getElementById('colorSelector').addEventListener('change', function(event) {
    alert('You selected ' + event.target.value);
  });
</script>

Этот код немедленно отображает пользователю предупреждение при выборе, указывая на выбранный цвет.

Использование события input

В отличие от события change, которое, как правило, срабатывает при потере фокуса текстовым полем, событие input немедленно запускается при каждом нажатии клавиши или изменении значения, обеспечивая обратную связь в реальном времени. Это особенно полезно для валидации вводимых данных по мере их ввода, например для проверки надёжности пароля или отображения живого счётчика символов.

Событие input также срабатывает для элементов contenteditable и для изменений, которые не связаны с клавиатурой вообще — вставка, перетаскивание, автозаполнение или голосовой ввод. Если вам нужно проверить или отменить редактирование до его применения к DOM, используйте вместо этого связанное событие beforeinput, чьё свойство event.inputType (например "insertText" или "deleteContentBackward") сообщает, какой именно тип редактирования собирается произойти.

Пример: динамическая валидация ввода

<input type="password" id="passwordInput" placeholder="Enter your password">
<div id="passwordStrength"></div>
<script>
  document.getElementById('passwordInput').addEventListener('input', function(event) {
    var strength = event.target.value.length;
    var strengthMessage = 'Weak';
    if(strength > 5) strengthMessage = 'Moderate';
    if(strength > 10) strengthMessage = 'Strong';
    document.getElementById('passwordStrength').textContent = 'Strength: ' + strengthMessage;
  });
</script>

Этот скрипт обновляет индикатор надёжности по мере того, как пользователь вводит пароль.

Обработка событий cut, copy и paste

События cut, copy и paste позволяют разработчикам взаимодействовать с буфером обмена, что может быть жизненно необходимо для приложений, требующих расширенного управления буфером. Обратите внимание, что event.clipboardData широко поддерживается во всех браузерах, тогда как navigator.clipboard требует безопасного контекста (HTTPS) и поддерживается во всех современных браузерах. Для поддержки старых браузеров используйте event.clipboardData или устаревший document.execCommand('copy').

Пример: взаимодействие с буфером обмена

<input type="text" id="clipboardInput" value="Copy this text">
<button id="copyBtn">Copy</button>
<script>
  document.getElementById('copyBtn').addEventListener('click', async function() {
    try {
      await navigator.clipboard.writeText(document.getElementById('clipboardInput').value);
      alert('Text copied!');
    } catch (err) {
      console.error('Failed to copy: ', err);
    }
  });

  document.getElementById('clipboardInput').addEventListener('paste', function(event) {
    event.preventDefault();
    alert('Pasting blocked. Pasted content: ' + event.clipboardData.getData('text'));
  });

  document.getElementById('clipboardInput').addEventListener('cut', function(event) {
    event.preventDefault();
    alert('Cutting blocked. Cut content: ' + event.clipboardData.getData('text'));
  });
</script>

Этот код обеспечивает функциональность копирования текста с помощью кнопки, демонстрирует, как перехватывать и блокировать операции с буфером обмена с помощью event.preventDefault(), и обрабатывает событие cut для повышения интерактивности веб-страницы.

Чтение и преобразование вставляемого содержимого

Распространённая реальная задача — не блокировать вставку, а очищать её — например, убирать форматирование или удалять переносы строк до того, как текст попадёт в поле. Вызовите event.preventDefault(), чтобы остановить вставку по умолчанию, прочитайте исходный текст с помощью event.clipboardData.getData('text'), преобразуйте его и вставьте очищенное значение самостоятельно:

const input = document.getElementById('clean-paste');

input.addEventListener('paste', (event) => {
  event.preventDefault();
  const pasted = event.clipboardData.getData('text');
  // Collapse whitespace/newlines into single spaces
  const cleaned = pasted.replace(/\s+/g, ' ').trim();
  input.value = cleaned;
});

clipboardData.getData('text') возвращает содержимое в виде обычного текста; вы также можете запросить 'text/html' для получения форматированного содержимого. Поскольку обработчики cut, copy и paste получают объект ClipboardEvent, они предоставляют доступ к clipboardData синхронно — в отличие от асинхронного, основанного на Promise API navigator.clipboard, используемого в кнопке копирования выше.

Заключение

Реализация событий JavaScript, таких как change, input, cut, copy и paste, не только повышает интерактивность веб-страниц, но и обеспечивает пользователям немедленную обратную связь и более увлекательный опыт. Используйте input, когда вам нужно живое поведение по мере ввода; используйте change, когда вас интересует только зафиксированное значение; применяйте события буфера обмена, когда нужно читать, очищать или контролировать копирование/вставку. Сочетайте их разумно — и ваши формы будут работать отзывчиво, не перегружая пользователей преждевременными сообщениями валидации.

Смотрите также

Практика

Практика
Какие из следующих утверждений верны относительно событий JavaScript 'change', 'input', 'cut', 'copy' и 'paste'?
Какие из следующих утверждений верны относительно событий JavaScript 'change', 'input', 'cut', 'copy' и 'paste'?
Was this page helpful?