Let’s cover various events that accompany data updates.
Event: change
The change event triggers when the element has finished changing.
For text inputs that means that the event occurs when it loses focus.
For instance, while we are typing in the text field below – there’s no event. But when we move the focus somewhere else, for instance, click on a button – there will be a change event:
<input type="text" onchange="alert(this.value)">
<input type="button" value="Button">
For other elements: select, input type=checkbox/radio it triggers right after the selection changes:
<select onchange="alert(this.value)">
<option value="">Select something</option>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
Event: input
The input event triggers every time after a value is modified by the user.
Unlike keyboard events, it triggers on any value change, even those that does not involve keyboard actions: pasting with a mouse or using speech recognition to dictate the text.
For instance:
<input type="text" id="input"> oninput: <span id="result"></span>
<script>
input.oninput = function() {
result.innerHTML = input.value;
};
</script>
If we want to handle every modification of an <input> then this event is the best choice.
On the other hand, input event doesn’t trigger on keyboard input and other actions that do not involve value change, e.g. pressing arrow keys ⇦ ⇨ while in the input.
oninputThe input event occurs after the value is modified.
So we can’t use event.preventDefault() there – it’s just too late, there would be no effect.
Events: cut, copy, paste
These events occur on cutting/copying/pasting a value.
They belong to ClipboardEvent class and provide access to the data that is cut/copied/pasted.
We also can use event.preventDefault() to abort the action, then nothing gets copied/pasted.
For instance, the code below prevents all cut/copy/paste events and shows the text we’re trying to cut/copy/paste:
<input type="text" id="input">
<script>
input.onpaste = function(event) {
alert("paste: " + event.clipboardData.getData('text/plain'));
event.preventDefault();
};
input.oncut = input.oncopy = function(event) {
alert(event.type + '-' + document.getSelection());
event.preventDefault();
};
</script>
Please note: inside cut and copy event handlers a call to event.clipboardData.getData(...) returns an empty string. That’s because technically the data isn’t in the clipboard yet. If we use event.preventDefault() it won’t be copied at all.
So the example above uses document.getSelection() to get the selected text. You can find more details about document selection in the article Selection and Range.
It’s possible to copy/paste not just text, but everything. For instance, we can copy a file in the OS file manager, and paste it.
That’s because clipboardData implements DataTransfer interface, commonly used for drag’n’drop and copy/pasting. It’s a bit beyond our scope now, but you can find its methods in the DataTransfer specification.
Also, there’s an additional asynchronous API of accessing the clipboard: navigator.clipboard. More about it in the specification Clipboard API and events, not supported by Firefox.