Давайте рассмотрим различные события, сопутствующие обновлению данных.
Событие: change
Событие change
срабатывает по окончании изменения элемента.
Для текстовых <input>
это означает, что событие происходит при потере фокуса.
Пока мы печатаем в текстовом поле в примере ниже, событие не происходит. Но когда мы перемещаем фокус в другое место, например, нажимая на кнопку, то произойдёт событие change
:
<input type="text" onchange="alert(this.value)">
<input type="button" value="Button">
Для других элементов: select
, input type=checkbox/radio
событие запускается сразу после изменения значения:
<select onchange="alert(this.value)">
<option value="">Выберите что-нибудь</option>
<option value="1">Вариант 1</option>
<option value="2">Вариант 2</option>
<option value="3">Вариант 3</option>
</select>
Событие: input
Событие input
срабатывает каждый раз при изменении значения.
В отличие от событий клавиатуры, оно работает при любых изменениях значений, даже если они не связаны с клавиатурными действиями: вставка с помощью мыши или распознавание речи при диктовке текста.
Например:
<input type="text" id="input"> oninput: <span id="result"></span>
<script>
input.oninput = function() {
result.innerHTML = input.value;
};
</script>
Если мы хотим обрабатывать каждое изменение в <input>
, то это событие является лучшим выбором.
С другой стороны, событие input
не происходит при вводе с клавиатуры или иных действиях, если при этом не меняется значение в текстовом поле, т.е. нажатия клавиш ⇦, ⇨ и подобных при фокусе на текстовом поле не вызовут это событие.
oninput
Событие input
происходит после изменения значения.
Поэтому мы не можем использовать event.preventDefault()
там – будет уже слишком поздно, никакого эффекта не будет.
События: cut, copy, paste
Эти события происходят при вырезании/копировании/вставке данных.
Они относятся к классу ClipboardEvent и обеспечивают доступ к копируемым/вставляемым данным.
Мы также можем использовать event.preventDefault()
для предотвращения действия по умолчанию, и в итоге ничего не скопируется/не вставится.
Например, код, приведённый ниже, предотвращает все подобные события и показывает, что мы пытаемся вырезать/копировать/вставить:
<input type="text" id="input">
<script>
input.oncut = input.oncopy = input.onpaste = function(event) {
alert(event.type + ' - ' + event.clipboardData.getData('text/plain'));
return false;
};
</script>
Технически, мы можем скопировать/вставить всё. Например, мы можем скопировать файл из файловой системы и вставить его.
Существует список методов в спецификации для работы с различными типами данных, чтения/записи в буфер обмена.
Но обратите внимание, что буфер обмена работает глобально, на уровне ОС. Большинство браузеров в целях безопасности разрешают доступ на чтение/запись в буфер обмена только в рамках определённых действий пользователя, к примеру, в обработчиках событий onclick
.
Также запрещается генерировать «пользовательские» события буфера обмена при помощи dispatchEvent
во всех браузерах, кроме Firefox.
Итого
События изменения данных:
Событие | Описание | Особенности |
---|---|---|
change |
Значение было изменено. | Для текстовых полей срабатывает при потере фокуса. |
input |
Срабатывает при каждом изменении значения. | Запускается немедленно, в отличие от change . |
cut/copy/paste |
Действия по вырезанию/копированию/вставке. | Действие можно предотвратить. Свойство event.clipboardData предоставляет доступ на чтение/запись в буфер обмена… |