Insert text in a
<textarea>
,<input>
andcontenteditable
(including Undo support)
You should use this instead of setting the field.value
directly because:
- it doesn't break the undo history
- it fires an
input
event (withevent.inputType === 'insertText'
) - it's the most efficient way of adding/replacing selected text in a field
- it's cross-browser (modern browsers)
It uses document.execCommand('insertText')
under the hood and it automatically focuses/blurs the field you pass.
You can download the standalone bundle
Or use npm
:
npm install text-field-edit
import textFieldEdit from 'text-field-edit';
// Alternatively only import the specific methods
import {
insertTextIntoField,
setFieldText,
getFieldSelection,
wrapFieldSelection,
replaceFieldText,
} from 'text-field-edit';
Insert text at the cursor, replacing any possible selected text, acting like a paste
would:
const input = document.querySelector('input');
const button = document.querySelector('.js-add-signature');
button.addEventListener(event => {
textFieldEdit.insert(input, 'Made by š with pollen.');
});
This will act like field.value = 'New value'
but with undo support and by firing the input
event:
const textarea = document.querySelector('textarea');
const resetButton = document.querySelector('.js-markdown-reset-field');
resetButton.addEventListener(event => {
textFieldEdit.set(textarea, 'New value');
});
Inserts text
at the cursorās position, replacing any selection.
const field = document.querySelector('input[type="text"]');
textFieldEdit.insert(field, 'š„³');
// Changes field's value from 'Party|' to 'Partyš„³|' (where | is the cursor)
Type: HTMLTextAreaElement | HTMLInputElement
or any contenteditable
element
Type: string
The text to insert at the cursor's position.
Replaces the entire content, equivalent to field.value = 'New text!'
but with undo support and by firing the input
event:
const textarea = document.querySelector('textarea');
textFieldEdit.set(textarea, 'New text!');
Type: HTMLTextAreaElement | HTMLInputElement
or any contenteditable
element
Type: string
The new value that the field will have.
Finds and replaces strings and regular expressions in the fieldās value, like field.value = field.value.replace()
but leaves the last replacement selected like a text editor would.
Similar to String#replace
const textarea = document.querySelector('textarea');
textarea.value = 'Hello world';
textFieldEdit.replace(textarea, 'Hello', 'Ciao');
// Changes field's value from 'Hello world' to '|Ciao| world' (where | marks the selected text)
Type: HTMLTextAreaElement | HTMLInputElement
(not available on contenteditable
)
Type: string | RegExp
The text to replace in the fieldās value.
Type: string | function
The text that will replace searchValue
or a callback function that matches the signature in String#replace
.
Note: replacement patterns (replace(field, /hello (world)/, 'ciao $1')
) aren't supported.
Adds the wrappingText
before and after fieldās selection (or cursor). If endWrappingText
is provided, it will be used instead of wrappingText
on the right.
const field = document.querySelector('textarea');
textFieldEdit.wrapSelection(field, '**');
// Changes the field's value from 'I |love| gudeg' to 'I **|love|** gudeg' (where | marks the selected text)
const field = document.querySelector('textarea');
textFieldEdit.wrapSelection(field, '(', ')');
// Changes the field's value from '|almost| cool' to '(|almost|) cool' (where | marks the selected text)
Type: HTMLTextAreaElement | HTMLInputElement
or any contenteditable
elements
Type: string
The string to prepend to the selection.
Type: string
The string to append to the selection. If not provided, wrappingText
will be used.
Utility method to get the selected text in a field or an empty string if nothing is selected.
const field = document.querySelector('textarea');
textFieldEdit.getSelection(field);
// => 'almost'
// If the field's value is '|almost| cool' (where | marks the selected text)
Type: HTMLTextAreaElement | HTMLInputElement
- indent-textarea - Add editor-like tab-to-indent functionality to
<textarea>
, in a few bytes. Uses this module. - fit-textarea - Automatically expand a
<textarea>
to fit its content, in a few bytes. - Refined GitHub - Uses this module.