data-autosave
Automatically save form drafts to localStorage as the user types. Restores on page reload with a toast notification. Clears on submit or reset.
Overview
The data-autosave attribute automatically persists form data to localStorage as the user types. If the page is accidentally closed or refreshed, the draft is restored on the next visit with a toast notification. The draft is cleared when the form is submitted or reset.
How It Works
Add data-autosave to any <form> element with a unique key as the value. The init script:
- Attaches delegated
inputandchangeevent listeners on the form - On every field change, debounces for 500ms then serializes all named fields to a JSON object
- Saves the object to
localStoragewith the keyvb-autosave:{key}and a timestamp - On page load, checks for a non-expired draft (24-hour expiry)
- If a draft exists, restores field values and fires
inputevents so other enhancements update - Shows a "Draft restored" toast notification via
toast-wcif available - Sets
data-autosave-initto prevent double-binding
Password fields (type="password") and file inputs (type="file") are always skipped — sensitive data and file references are never stored.
Attributes
| Attribute | Value | Description |
|---|---|---|
data-autosave |
string (required) | A unique storage key for this form. Used as part of the localStorage key: vb-autosave:{key}. |
data-autosave-init |
boolean | Set automatically to prevent double-binding. Do not set manually. |
Storage Format
The draft is stored as a JSON object in localStorage. Each named field in the form becomes a key-value pair. A _ts timestamp is included for expiry checking.
| Detail | Value |
|---|---|
| Key format | vb-autosave:{key} |
| Debounce | 500ms after last input |
| Expiry | 24 hours from last save |
| Skipped types | password, file |
Multiple Forms
Each form on a page must have a unique data-autosave key. The key is used directly in the localStorage key, so collisions between forms on different pages are avoided by using descriptive names.
Checkboxes and Radios
Checkbox and radio inputs are handled correctly during both save and restore:
- Checkboxes — stored as
"on"when checked,""when unchecked. On restore, thecheckedproperty is set accordingly. - Radio buttons — only the checked radio's value is stored for the group name. On restore, the matching radio is checked.
With Other Enhancements
When a draft is restored, input events are fired on each restored field. This ensures other Vanilla Breeze enhancements that listen for input events — such as data-count, data-grow, and data-show-when — update correctly.
Toast Notification
When a draft is restored, a toast notification is displayed if toast-wc is available on the page. The toast uses the following configuration:
- Message: "Draft restored"
- Variant:
info - Duration: 3000ms (auto-dismisses)
If toast-wc is not present, the draft is still restored silently without a notification.
Clear Behavior
The autosave draft is automatically cleared in two scenarios:
- Form submit — the draft is removed from
localStoragewhen the form is submitted - Form reset — the draft is removed when the form is reset via a reset button or
form.reset()
Styling
The autosave attribute itself has no visual output. The only visible indicator is the toast notification on restore, which inherits styles from toast-wc.
All behavior is gated on data-autosave-init. Without JavaScript, the form works normally — data simply is not persisted to localStorage.
Accessibility
- The "Draft restored" toast notification is announced by screen readers via
toast-wc's accessible live region - Restored form state preserves the user's previous work, reducing frustration from accidental navigation
- No visual layout changes occur during restore — fields are populated in place
- Firing
inputevents on restore ensures dependent enhancements (character counts, conditional fields) are in the correct state for assistive technology - Password and file fields are excluded from storage for security — users are not given a false sense of persistence for sensitive data
- Without JavaScript, the form works as a standard HTML form — progressive enhancement