The <textarea>
element in HTML defines a multi-line plain text editing control that provides users the ability to enter and manipulate text over multiple lines. With its unmatched flexibility and ubiquity across web forms, the textarea is among the most important and widely used text-based input elements today.
In this comprehensive 2500+ word guide, we will explore a wide range of techniques, best practices, use cases and expert advice for working with textareas using JavaScript.
Getting and Setting Textarea Value
The starting point of working with textareas is accessing the element itself and getting/updating its value.
To get the textarea node, use document.getElementById()
:
// Get textarea element
let textarea = document.getElementById("myTextarea");
Or with querySelector()
:
let textarea = document.querySelector("#myTextarea");
Get Current Value
The text inside a textarea is stored in its value
property.
// Get current text
let text = textarea.value;
Set New Value
Assign a string to value
to programmatically update the textarea text:
// Set new text
textarea.value = "Updated message";
This allows prefilling textarea dynamically via JavaScript.
Empty Textarea
Set an empty string to clear out all text quickly:
textarea.value = "";
Replace Text
Use regex to replace parts of current content:
// Replace numbers with text
textarea.value = textarea.value.replace(/[0-9]/g, "Num");
Character Limits
Textareas can hold large volumes of text. To restrict max length allowed, use HTML attribute maxlength
:
<!-- Allow only 500 chars -->
<textarea maxlength="500">
</textarea>
Maxlength Value
To get or dynamically set the limit:
// Get max length
let limit = textarea.maxLength;
// Set max length
textarea.maxLength = 400;
Count Text Length
Find current text length with .length
property:
let length = textarea.value.length;
if(length > textarea.maxLength) {
// Text exceeds limit
}
Compare with maxlength to validate or enforce the restriction.
Trim Excess Text
Automatically trim content once limit is exceeded:
textarea.addEventListener(‘input‘, function(){
if(this.value.length > this.maxLength) {
this.value = this.value.slice(0, this.maxLength);
}
});
This provides good UX by preventing a broken red error state.
A Flexible Limit
For use cases needing a dynamic or no fixed upper limit, set to a high number:
<!-- Act as no limit -->
<textarea maxlength="5000">
</textarea>
Real-time Character Count
Displaying remaining chars or length of text entered is useful for textareas with limits.
Character Counter
Increment counter on input
event:
let count = document.getElementById("charCount");
textarea.addEventListener(‘input‘, () => {
let length = textarea.value.length;
count.innerText = length + ‘/‘ + textarea.maxLength;
});
Word Counter
Count words instead of chars using .split()
:
let words = textarea.value.trim().split(/\s+/).length;
count.innerText = words + ‘ words entered‘;
Progress Bar
Visualize length with a progress element:
let progress = document.getElementById(‘progress‘);
textarea.addEventListener(‘input‘, () => {
let percent = Math.floor((textarea.value.length / textarea.maxLength) * 100);
progress.style.width = percent + ‘%‘;
});
These dynamic indicators improve textarea usability.
Auto-Resizing Height
Textareas have a fixed height by default causing scroll on adding more lines of text. We can enhance UX by automatically increasing the height as required.
Self Expanding Height
Use the scroll height value to get required height:
textarea.addEventListener(‘input‘, autoResize);
function autoResize() {
this.style.height = ‘auto‘;
this.style.height = this.scrollHeight + ‘px‘;
}
This will keep expanding to show all text entered.
Set Maximum Height
Restrict height to avoid unnecessary growth with css max-height
:
textarea {
max-height: 300px;
overflow-y: auto;
}
Now scroll will kick in only after the height limit.
Auto Shrink
To reduce the textarea height as content is deleted by user:
function autoResize() {
this.style.height = ‘auto‘;
let h = Math.max(this.scrollHeight, 50) + ‘px‘;
this.style.height = h;
}
Here we apply a 50px minimum height to avoid complete collapse.
Cross Browser Compatibility
Since textareas have existed from early browser days, they enjoy excellent support across browsers. However, some best practices should be kept in mind for consistency.
Define Rows & Columns
Always set the rows
and cols
attribute instead of relying on default values:
<!-- Define textarea dimensions -->
<textarea rows="8" cols="50">
</textarea>
Multi-Line Support
Ensure the wrap
attribute is present for multi-line capabilities in older IE versions:
<textarea wrap="soft">
</textarea>
Styling Restrictions
Certain CSS properties like border-radius
may not work in some browsers like Firefox. Prefer using a container div
for such styles instead of directly on textarea.
Use vendor prefixes wherever required, for example:
textarea {
resize: vertical;
-webkit-resize: vertical; /* For Safari */
}
Textarea Accessibility
With great keyboard navigation, built-in multi-line capabilities and semantic meaning, textareas already aid accessibility. But some enhancements can be made for better compliance with assistive devices and interaction.
Label Association
Link the textarea to an associated <label>
by id
and for
attributes:
<label for="comment">Comments</label>
<textarea id="comment">
</textarea>
ARIA Attributes
Mark required indicator and invalid state changes:
<!-- Required field -->
<textarea aria-required="true">
</textarea>
<!-- Error message -->
<div role="alert" aria-live="assertive"></div>
Touch Accessibility
Optimize tap targets, spacing and auto capitalization for mobile devices.
Textarea Data Persistence
While typing out a long message in textarea, users would hate losing it due to accidental page close, reload etc. We can persist entered text using localStorage
API:
// Save data on input event
textarea.addEventListener(‘input‘, () => {
localStorage.setItem(‘savedText‘, textarea.value);
});
// Get saved data on load
textarea.value = localStorage.getItem(‘savedText‘);
This will preserve textarea data across sessions.
Server Side Saving
Submit periodically to server for saving state on database/file if data is critical:
// Save every minute
setInterval(() => {
autosaveTextToServer(textarea.value);
}, 60000);
So text can stay preserved irrespective of client state.
Textarea Form Validation
Validation is important for securing quality user input. Some essential validations for textareas:
Presence Check
Ensure some text was entered with .trim()
:
if(textarea.value.trim() === ‘‘) {
// Show error message
return false;
}
Can allow white spaces using just .length
check.
Minimum Length
Require certain number of characters using .length
:
const min = 50;
if(textarea.value.length < min) {
// Show error message
return false;
}
Maximum Length
Use maxlength attribute and .length
to enforce upper limit:
if(textarea.value.length > textarea.maxLength) {
textarea.value = textarea.value.slice(0, textarea.maxLength);
// Show max limit error
}
Text Format Validation
Match against custom regex patterns:
const urlRegex = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&‘\(\)\*\+,;=.]+$/;
if(!urlRegex.test(textarea.value)) {
// Show invalid format error
return false;
}
Correcting Invalid Data
In some cases we can fix instead of reject invalid data, for example trimming white spaces.
Customized & Rich Textareas
While native textareas provide basic editing, many use cases demand more formatting capabilities and options beyond plain text.
Some ways to enhance textareas:
Syntax Highlighting
Display code snippets with colored syntax highlight using libraries like PrismJS:
Prism.highlightElement(textarea);
Markdown Formatting
Convert markdown formatted text to rich HTML using libraries like MarkedJS:
let html = marked(textarea.value);
preview.innerHTML = html;
Rich Text Editing
Add text formatting features like setting fonts, text color etc with editors such as TinyMCE:
See integrations guides to convert a basic textarea into a feature-packed editor using such libraries.
Textareas in JavaScript Frameworks
Let‘s see how textareas can be used with popular JavaScript frameworks:
React Textareas
Encapsulate in a component managing state and input binding:
function Textarea(props) {
const [text, setText] = React.useState(‘‘);
return (
<textarea
value={text}
onChange={(e) => setText(e.target.value)}
>
</textarea>
);
}
Add validations, character limit etc within component logic.
Vue.js Textarea
Use v-model
for two-way data bindings:
<textarea v-model="message">
</textarea>
data() {
return {
message: ‘‘
}
}
Directly apply character count and other features as convenient directives.
AlpineJS Textarea
Bind textarea value to component state:
<textarea x-data="{ text: ‘‘ }" x-text="text">
</textarea>
Watch for input changes:
<textarea x-on:input="text = $event.target.value">
</textarea>
Additional Textarea Tips
Some additional best practices for working with textareas:
- Use CSS property
resize
to allow or disable user resizing - Set
spellcheck="true|false"
attribute for browser spell checking - Use
<fieldset>
&<legend>
to associate textareas as a logical group - Add placeholder text as a hint for expected input
- For privacy, disable text prediction and auto-fill using
autocomplete="off"
- Ensure sufficient contrast levels for accessibility
- On mobile, set
autocapitalize="sentences"
for auto capitalization - Prevent zooming on focus for textareas accepting numeric input like CC numbers
- Show remaining allowed characters when close to
maxlength
- Display or hide scrollbars explicitly using CSS
- Move cursor to end after dynamic textarea updates to aid user awareness
- Associate helpful assistance text with aria descriptions
- Handle Escape key press to undo changes
The Future of Textareas
Here are some upcoming capabilities in the horizons for textareas:
- Native integration with rich text editing features
- Intelligent predictions, suggestions and auto-completion
- Enhanced customization of touch and mouse cursors
- Voice dictation and speech input integration
- Support for markdown and other non-plain text formats
- Ability to fully style textareas akin to rich text editors
- Increased control and customization over selection handles
- Access to clipboard and undo manager programmatically
- Better naming and association to parts of a textarea content
- Standardizing browser differences in event models
JavaScript frameworks will simplify leveraging these emerging attributes within textarea components as browsers evolve to support them.
Conclusion
Textareas remain among the most essential text input components despite rising alternatives. This extensive guide summarized a wide range of techniques and best practices for effectively working with textareas using JavaScript:
- Interacting with textarea value and state
- Managing maxlength and dynamic counters
- Improving usability with auto-expanding height
- Cross browser compatibility considerations
- Adding widespread keyboard and screen reader accessibility
- Persisting entered data
- Integrating text validation
- Using textareas with popular JavaScript frameworks
- Exploring the future capabilities of textareas
With textareas being ubiquitous across forms, comments, reviews and other text entry needs, learning how to progress beyond basic textareas to add extensive features can hugely polish and enhance text input experiences on the web for users.