WCAG 3.2.2: On Input
Choosing an option from a dropdown should not teleport you to another page. This criterion requires that changing a control’s setting never automatically causes a change of context — no auto-navigation, no auto-submit, no stolen focus — unless the user was clearly told beforehand. Users adjust settings, then commit with an explicit action. That order is what makes forms predictable.
The success criterion, in full
Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.
Two load-bearing phrases: changing the setting (state changes while operating a control — not clicks on buttons or links, which are explicit requests) and advised before using (a visible notice the user encounters ahead of the control, not an explanation after the jump has already happened).
Who this helps
Keyboard users
Browsing a select with arrow keys changes its value option by option. If onchange navigates, they are yanked away before reaching their choice — the control is unusable without a mouse.
Screen reader users
They hear one option at a time and often step through all of them before deciding. Auto-triggering context changes mid-exploration means never hearing the full list.
People with cognitive disabilities
Predictable cause and effect is essential. When adjusting a value silently commits it and moves the page, users lose track of what happened and why.
People with motor disabilities and low vision
Mis-selections happen constantly — a slipped click, a magnified view hiding the consequences. A separate confirm step turns every mis-selection into a non-event.
The through-line with 3.2.1 On Focus is a single principle: the interface changes context only when the user asks it to. 3.2.1 protects looking; 3.2.2 protects adjusting; buttons remain the place where things actually happen.
Settings, activations, and the exception
Auditing 3.2.2 means sorting interactions into three buckets:
- Setting changes (covered): selecting an option, checking a box, choosing a radio button, typing in a field, moving a slider. These must not auto-cause a change of context — new page, submitted form, new window, moved focus, or a content change that alters the page’s meaning.
- Activations (not covered): clicking a button or link, pressing Enter to submit. These are explicit requests — navigating or submitting in response is exactly what the user asked for.
- Warned behaviors (the exception): a context change on input is permitted if the user is advised before using the component — a visible instruction ahead of the control in reading order (and programmatically associated, e.g. via
aria-describedby), such as “Selecting a country reloads this form.”
Content updates that keep the user in place — filtering results, revealing a dependent field, updating a total — are usually fine. The safest layout puts the updated content after the control in reading order, so screen reader users encounter changes downstream of where they are, never behind them. Even better, prefer the AAA pattern of 3.2.5 Change on Request: put every context change behind an explicit button and the question never arises.
Pass and fail examples
Pass: language select with a Go button
Users pick a language from the select, review their choice, and press “Apply” to reload the site in that language. The context change happens on activation, not on input.
Pass: filter checkboxes update results below
Ticking “In stock only” re-filters the product grid that follows the filters. Focus stays on the checkbox, the page’s meaning is intact, and a live region announces “24 results.” A content change, not a context change.
Pass (exception): warned auto-advance
Above a 6-box verification code input, visible instructions say: “Focus moves to the next box automatically as you type each digit.” The user was advised before using the component, so the focus moves conform under the exception.
Fail: jump menu navigates onchange
A “Quick links” select fires location.href the moment its value changes. A keyboard user pressing ↓ to scan the options is navigated to the first option’s page before seeing the second.
Fail: radio button submits the form
Choosing a shipping method instantly submits the checkout form with no warning. Users who wanted to compare options have committed to the first one they touched.
Code examples
The jump-menu fix: add a real submit action
<!-- ✗ Fails: changing the selection navigates immediately -->
<select onchange="location.href = this.value">
<option value="/docs">Documentation</option>
<option value="/pricing">Pricing</option>
<option value="/support">Support</option>
</select>
<!-- ✓ Passes: the user commits the choice with a button -->
<form action="/go" method="get">
<label for="dest">Go to section</label>
<select id="dest" name="dest">
<option value="/docs">Documentation</option>
<option value="/pricing">Pricing</option>
<option value="/support">Support</option>
</select>
<button type="submit">Go</button>
</form>Content updates are fine; context changes are not (React)
An onChange handler may update state that re-renders content after the control. It must not navigate, submit, or move focus.
// ✗ Fails: selecting a plan navigates automatically
function PlanPicker() {
const router = useRouter()
return (
<select onChange={(e) => router.push("/checkout?plan=" + e.target.value)}>
…
</select>
)
}
// ✓ Passes: selection updates a summary; a button performs the navigation
function PlanPicker() {
const router = useRouter()
const [plan, setPlan] = useState("starter")
return (
<>
<label htmlFor="plan">Plan</label>
<select id="plan" value={plan} onChange={(e) => setPlan(e.target.value)}>
<option value="starter">Starter — $9/mo</option>
<option value="team">Team — $29/mo</option>
</select>
<PlanSummary plan={plan} /> {/* content update below the control */}
<button type="button" onClick={() => router.push("/checkout?plan=" + plan)}>
Continue to checkout
</button>
</>
)
}Using the exception: advise before the component
If a context change on input is genuinely necessary, the warning must come first — visible, and programmatically associated.
<!-- ✓ Conforms via the exception: user is advised before using the control -->
<p id="country-note">
Selecting a country reloads this page to show local pricing and tax.
</p>
<label for="country">Country</label>
<select id="country" aria-describedby="country-note"
onchange="reloadWithCountry(this.value)">
<option>United States</option>
<option>Germany</option>
<option>Japan</option>
</select>
<!-- Better still: avoid needing the exception with an Apply button -->Common failures
- Jump menus: select elements that navigate onchange with no Go button and no advance warning.
- Forms that auto-submit when the last field is filled, a radio button is chosen, or a checkbox is ticked.
- Country, language, or currency selectors that reload the page the instant a value changes, with no notice before the control.
- Auto-advancing multi-box inputs (verification codes, card numbers, dates) with no instructions telling users focus will move.
- Typing in a search field triggering full navigation to a results page after n characters, rather than updating a results region in place.
- Opening a new window or modal as a side effect of checking a box or picking an option.
- Putting the 'warning' after the control, in a tooltip, or only in text users reach once the jump has already fired — advice must come before use.
How to test for 3.2.2
- 1
Change every setting without confirming anything
Work through each select, checkbox, radio group, slider, and text field. Change the value and stop. The page must not navigate, submit, open windows, or move focus. Anything beyond an in-place content update is a finding.
- 2
Drive selects with the keyboard
Focus each select and press the arrow keys. In several browsers this changes the value option by option — the exact scenario that detonates onchange navigation. If browsing options triggers a jump, it fails.
- 3
Type one character in each text field
Watch for auto-submission after a character count, focus leaping to the next field, or navigation from live search. Any of these without prior notice is a failure.
- 4
Check claimed warnings
Where a context change on input is intended, verify the advisory text is visible before the control in reading order and associated with it (aria-describedby). A warning discovered after the jump does not count.
- 5
Grep for the risky handlers
Search the codebase for onchange/onChange and oninput/onInput containing location.href, router.push, form.submit(), window.open, or .focus(). Each match either needs a button-based redesign or a compliant advance warning.
Run this together with 3.2.1 On Focus in a single keyboard pass — first Tab everywhere (3.2.1), then operate everything (3.2.2). The full WCAG 2.2 checklist covers the rest of the Predictable guideline.
Frequently asked questions
What does WCAG 3.2.2 On Input require?
Changing the setting of any user interface component — selecting an option in a dropdown, ticking a checkbox or radio button, typing into a field — must not automatically cause a change of context, unless the user has been advised of that behavior before using the component. Changes of context include loading a new page, submitting a form, opening a new window, and moving focus elsewhere. The user should commit such changes with an explicit action, typically a button. It is a Level A criterion under Guideline 3.2 Predictable, present since WCAG 2.0.
What counts as 'changing the setting' of a component?
Any change to the component's state or value made while operating it: choosing a select option, toggling a checkbox, picking a radio button, typing a character into a text field, moving a slider. It does not include activation — clicking a button or link is an explicit request, not a settings change, so a button that navigates is perfectly fine. That distinction is the heart of 3.2.2: state changes must be inert; deliberate activations may do anything.
Is a select that navigates onchange always a failure?
It fails unless users are told beforehand. The notorious pattern — a 'jump menu' that fires location.href the instant an option is highlighted — is especially harsh on keyboard users, because in some browsers pressing the down arrow to browse options changes the selection and triggers navigation before they ever reach the option they wanted. The standard fix is a Go button next to the select. Alternatively, a visible note before the control ('Selecting a language will reload the page') satisfies the advance-warning exception.
Does updating page content when a setting changes violate 3.2.2?
Not necessarily. The criterion forbids automatic changes of context, not changes of content. Filtering a product list when a checkbox is ticked, updating a price preview, or showing an extra field relevant to a selected option are content updates that generally keep the user oriented — especially when the updated content comes after the control in reading order. It becomes a change of context when the meaning of the page changes or the user is moved: full navigation, form submission, focus jumping, a new window, or a wholesale rearrangement of the page.
Are auto-advancing fields (like OTP code inputs) a 3.2.2 problem?
They are risky. Automatically moving focus to the next field once a character is typed is a change of context (a change of focus) triggered by changing a setting. The W3C's Understanding document uses exactly this example for the exception: it can conform if the user is advised of the behavior beforehand — for instance, instructions before the fields saying focus will move automatically as digits are entered. Without that advance notice, auto-advance fails, and it causes real problems for users who type, check, and correct as they go.
How is 3.2.2 different from 3.2.1 On Focus and 3.2.5 Change on Request?
3.2.1 (Level A) covers receiving focus: tabbing onto a component must change nothing. 3.2.2 (Level A) covers operating a component: changing its setting must not auto-trigger a context change unless warned. 3.2.5 Change on Request (Level AAA) goes further: all context changes happen only at the user's explicit request, with no 'we warned you' escape hatch. Meeting 3.2.5's pattern — every context change behind a button — automatically satisfies 3.2.2 and is the most robust design.
Related Success Criteria
When a component receives focus, it does not initiate a change of context.
Navigational mechanisms are repeated in the same relative order.
Components with the same functionality are identified consistently.
Changes of context are initiated only by user request.
Help mechanisms appear in the same relative order across pages.