WCAG 2.2.4: Interruptions
A toast slides in. A chat window pops open. The news feed reflows and the paragraph you were reading jumps off-screen. For many users these are minor annoyances; for someone with an attention or memory disability, or a screen reader user whose reading position just got hijacked, they can end the task entirely. 2.2.4 requires that users can postpone or suppress interruptions — with one exception: genuine emergencies.
The success criterion, in full
Interruptions can be postponed or suppressed by the user, except interruptions involving an emergency.
“Emergency” is a defined term: a sudden, unexpected situation or occurrence that requires immediate action to preserve health, safety, or property. Everything else — however important it feels to the product team — must be deferrable or silenceable.
Who this helps
People with attention disabilities
For users with ADHD, an interruption is not a blip — regaining deep focus on the original task can take many minutes, or not happen at all.
People with cognitive or memory disabilities
An alert that replaces the current context can erase working memory of what the user was doing and why.
Screen reader users
Focus-stealing dialogs and live updates can move the reading cursor mid-sentence, forcing the user to hunt for where they were.
People with low vision
Magnification shows a small viewport; content that shifts or reflows under an update means losing one's place completely.
The common thread: interruptions cost different users wildly different amounts. Letting each user decide when — and whether — to receive them equalizes that cost.
What counts as an interruption
An interruption is content-initiated, not user-initiated. If the page decides the moment, it is an interruption; if the user asked for it, it is a response. Typical interrupters:
- Toast and banner notifications announcing messages, promotions, or feature launches.
- Chat widgets that open themselves or play sounds when an agent 'joins'.
- Modals that appear on a timer — newsletter signups, exit-intent overlays, rating prompts.
- Auto-updating content: live feeds, tickers, dashboards, and scores that reflow the page.
- Automatic page refreshes or redirects that reset scroll position and focus.
- Scripted focus moves — anything that relocates keyboard focus without a user action.
For each of these you need at least one of two affordances:
Postpone
The user can defer the interruption to a moment they choose: “remind me later,” a queued notification center they open when ready, or updates that wait for an explicit “show new items” action.
Suppress
The user can turn the interruption off entirely — per category, in an easy-to-find preferences surface that persists across visits.
Pass and fail examples
✓ Passes 2.2.4
- A news page shows a “12 new stories — show them” button instead of injecting stories into the feed automatically.
- A web app’s settings include per-category notification toggles: mentions, marketing, tips, sounds.
- A chat widget stays closed and silent until the user opens it; new-message state is a subtle badge.
- A “session ending in 2 minutes” warning interrupts immediately — data loss qualifies as an emergency.
- A dashboard offers “pause live updates” and remembers the choice.
✗ Fails 2.2.4
- A newsletter modal that opens 20 seconds into reading, every visit, with no way to prevent it.
- A live-score ticker that reflows the article every few seconds and cannot be paused or disabled.
- A chat popup that grabs keyboard focus when an agent sends a message mid-form-fill.
- A page that meta-refreshes every 60 seconds, resetting the screen reader’s reading position.
- “New feature” announcement dialogs that cannot be dismissed permanently or deferred.
Code examples
Let users request updates instead of pushing them
Buffer incoming items and surface a polite, non-focus-stealing control. The user decides the moment of interruption.
<div aria-live="polite">
<button id="show-new" hidden>Show 12 new stories</button>
</div>
<ol id="feed"><!-- existing stories --></ol>
<script>
const buffer = [];
socket.on("story", (story) => {
buffer.push(story); // ✓ buffer, don't inject
showNew.textContent = `Show ${buffer.length} new stories`;
showNew.hidden = false; // announced politely, focus untouched
});
showNew.addEventListener("click", () => {
feed.prepend(...buffer.map(render)); // ✓ user chose the moment
buffer.length = 0;
showNew.hidden = true;
});
</script>A persistent notification-preferences surface
Suppression must be per-category, persistent, and reachable before the first interruption does damage.
<fieldset>
<legend>Notifications</legend>
<label>
<input type="checkbox" name="notif" value="mentions" checked />
Mentions and replies
</label>
<label>
<input type="checkbox" name="notif" value="tips" />
Tips and feature announcements
</label>
<label>
<input type="checkbox" name="notif" value="marketing" />
Offers and promotions
</label>
<label>
<input type="checkbox" name="notif" value="sound" />
Play a sound with notifications
</label>
</fieldset>
<script>
// Respect the stored preference before showing anything
function maybeNotify(category, payload) {
const prefs = JSON.parse(localStorage.getItem("notifPrefs") ?? "{}");
if (prefs[category] === false) return; // ✓ suppressed by the user
queueToast(payload); // polite live region, no focus move
}
</script>Announce without stealing focus
<!-- ✗ role="alert" + focus() for a routine update: maximal interruption -->
<div role="alert" tabindex="-1" id="promo">Check out our new plans!</div>
<script>promo.focus()</script>
<!-- ✓ Routine updates: polite live region, focus stays where the user is -->
<div aria-live="polite" id="status"></div>
<script>status.textContent = "Draft saved";</script>
<!-- ✓ Reserve role="alert" (assertive) for genuine emergencies only -->
<div role="alert">Your session expires in 2 minutes. Extend to keep your work.</div>Common failures
- Timed marketing modals (newsletter, discount, exit-intent) with no mechanism to postpone or permanently suppress them.
- Auto-updating feeds, tickers, and dashboards with no pause or 'update on request' option — often a 2.2.2 failure as well.
- Chat and support widgets that open themselves, play sounds, or take focus when the user has not engaged them.
- Automatic page refresh via meta refresh or scripted reload that the user cannot disable.
- Using assertive live regions (role='alert') for routine, non-emergency messages, forcing screen readers to announce them immediately over the user's current task.
- Notification settings that exist but do not persist, reset on each visit, or fail to cover major interrupting surfaces like in-app announcement dialogs.
- Treating business-important messages (sales, upgrade prompts) as 'emergencies' — the exception covers threats to health, safety, or property, including imminent data loss, and nothing else.
How to test for 2.2.4
- 1
Sit on the page and wait
Load key pages and do nothing for several minutes. Note everything that appears, moves, refreshes, sounds, or changes without your input — each one is an interruption to evaluate.
- 2
Work through a task while interruptions fire
Fill a long form or read a long article while notifications arrive. Check whether focus ever moves without your action and whether your scroll or reading position is disturbed.
- 3
Look for postpone and suppress controls
For every interruption found, verify the user can defer it (notification center, 'show new items', 'remind me later') or disable it (persistent per-category preferences). At least one of the two must exist.
- 4
Verify persistence of preferences
Turn notifications off, reload, clear the session, and revisit. Suppression that silently resets is suppression that does not exist.
- 5
Audit the emergency claims
For any interruption exempted as an emergency, check it against the definition: immediate action needed to preserve health, safety, or property (including the user's data). Session-expiry warnings qualify; promotions never do.
Test with a screen reader running: interruptions that look mild visually are often severe aurally. Continue with the full WCAG 2.2 checklist.
Frequently asked questions
What does WCAG 2.2.4 Interruptions require?
It requires that interruptions — content updates, alerts, popups, and other events initiated by the page rather than the user — can be postponed or suppressed by the user, except when the interruption involves an emergency. In practice that means giving users a way to defer non-critical notifications until they finish what they are doing, or to switch them off entirely, typically through a preference setting or per-notification controls.
What counts as an 'interruption'?
Anything the content initiates that redirects the user's attention away from their current activity: toast notifications, chat message popups, newsletter modals that appear mid-read, auto-updating news tickers or feeds that reflow content, alert dialogs announcing new features, automatic page refreshes, and content that moves focus without the user asking. User-initiated updates — clicking 'refresh results' — are not interruptions, because the user chose the moment.
What qualifies for the emergency exception?
The W3C defines an emergency as a sudden, unexpected situation that could threaten health, safety, or property. Civil emergency alerts, a warning that the user's session is about to end with data loss, a security alert about their account, or a message that an action they took is causing harm all qualify. A sale announcement, a new-message badge, or a cookie banner does not. The bar is danger to the user, not importance to the business.
How is 2.2.4 different from 2.2.1 Timing Adjustable and 2.2.2 Pause, Stop, Hide?
2.2.1 (A) governs time limits; 2.2.2 (A) governs moving, blinking, scrolling, and auto-updating content that plays alongside other content, requiring pause/stop/hide controls. 2.2.4 (AAA) is broader in one dimension: it covers any interruption of the user's activity — including dialogs, focus moves, and page refreshes that 2.2.2 does not reach — and it requires that users can postpone or suppress them, not merely pause a visual movement. A page can pass 2.2.2 (the ticker has a pause button) and still fail 2.2.4 (a chat popup keeps stealing focus with no way to turn it off).
Does an automatic page refresh fail 2.2.4?
An automatic refresh or redirect that the user cannot disable is a classic interruption failure: it can move their reading position, reset a form, or yank a screen reader's virtual cursor back to the top of the page. To conform, let users opt out of auto-refresh (or make manual refresh the default), or use targeted live-region updates that add content without disturbing focus or scroll position.
Is a notification preferences page enough to pass?
Usually, yes — a settings surface where users can suppress or defer each category of non-emergency notification is the canonical technique (W3C technique SCR14 describes making updates user-requestable). Two caveats: the preference must actually cover all interrupting content, and the default experience must not punish users before they find the setting — for example, focus-stealing modals on first page load still interrupt users who have had no chance to opt out.
Related Success Criteria
Users can turn off, adjust, or extend time limits.
Moving, blinking, or auto-updating content can be paused, stopped, or hidden.
Timing is not an essential part of the event or activity.
User data is preserved when a session expires and re-authentication is required.
Users are warned of the duration of inactivity that could cause data loss.