3.2.5 Change on Request

WCAG 2.2 · 3.2.5 AAA Understandable

What it requires

Changes of context must happen only when the user asks for them, or the user must be able to turn off such automatic changes. A “change of context” is a major shift that can disorient someone: opening a new window, moving focus to a different component, navigating to a new page, or substantially rearranging the page.

In plain terms: nothing should suddenly redirect the page, launch a pop-up, submit a form, or jump focus on its own. Either the user triggers the change deliberately (clicking a button or link), or there is an available mechanism to suppress automatic changes. This is the stricter AAA companion to 3.2.1 On Focus and 3.2.2 On Input, which only forbid changes triggered by focus or input; 3.2.5 covers automatic and unexpected changes more broadly.

  • Screen reader users, who lose their place when content or focus moves without warning and may not notice a new window or page opened.
  • People with cognitive or attention disabilities, for whom auto-redirects, timed pop-ups, and shifting layouts break concentration and comprehension.
  • Low-vision and magnifier users, who only see part of the screen and can miss content that appears or moves elsewhere.
  • Keyboard-only users, whose focus position is disrupted by unrequested context changes.

How to detect it

Concrete checks for Change on Request
Check How Catches
Auto-redirect / refresh Load the page and wait; does it navigate or reload without action? Inspect for <meta http-equiv="refresh"> or timed location changes. Manual
Unrequested pop-ups Watch for dialogs, new windows, or overlays that appear on load or on a timer rather than from a user click. Manual
Focus jumps Tab through and use a screen reader; confirm focus moves only after a deliberate activation, not automatically. Keyboard / SR
Opt-out mechanism If automatic changes exist, verify a clearly available control to disable them. Manual
Automated tooling Tools like axe can flag meta refresh but cannot judge intent or timed scripts; mostly manual. Partial (axe)

How to fix it

  1. Remove auto-redirects and <meta http-equiv="refresh">; offer a link or button the user activates instead.
  2. Trigger new windows, navigation, and form submission only from explicit user actions.
  3. Do not move focus automatically; let the user drive focus changes.
  4. Where automatic updates are genuinely needed, provide a clearly available mechanism to pause or turn them off.
<!-- User requests the change with a link, not an auto-redirect -->
<p>Your session has moved.
  <a href="/dashboard">Go to your dashboard</a>.</p>

Copy-paste tests

Automated coverage

The axe-core rule meta-refresh-no-exceptions flags failures of this criterion (a timed <meta http-equiv="refresh"> redirect). Run it via the axe DevTools browser extension or axe-core in CI. Automated tools catch only SOME failures — timed scripts, pop-ups, and focus jumps still need manual review.

Run this in the browser console

console — change-on-request.js
// Read-only: surface elements that may force a change of context.
const meta = [...document.querySelectorAll('meta[http-equiv="refresh" i]')];
const targets = [...document.querySelectorAll('[target="_blank"], [onload], [onchange]')];
const suspects = [...meta, ...targets];
suspects.forEach(el => { el.style.outline = '2px solid magenta'; });
console.table(suspects.map(el => ({
  tag: el.tagName.toLowerCase(),
  content: el.getAttribute('content') || el.getAttribute('target') || '',
  text: (el.textContent || '').trim().slice(0, 40)
})));
console.log('Review %d suspect node(s) for unrequested context changes.', suspects.length);

What to check manually: sit on the page and wait — confirm it does not redirect, reload, open a window, or move focus on its own; and if any automatic change exists, verify a clearly available control lets you turn it off.