J5.09.4virtual buffer refreshdesignresearch

After dynamic updates the buffer must be rebuilt or speech is stale

Aliases: off-screen model refresh · stale buffer · buffer rebuild

What it is

The virtual buffer is a copy. When the page swaps the main region, rewrites a list, or inserts nodes without a full reload, that copy does not become the new document by itself — the reader has to see accessibility mutations and rebuild the buffer (virtual buffer refresh) before the virtual cursor walks current content. If the rebuild does not happen, arrow keys speak the previous edition: paragraphs already torn down, buttons that no longer exist, headings already replaced.

This is not the same fact as “updates must be announced.” Without an announcement the user may not know something changed. Without a rebuild they follow an old map and hit ghost nodes. Both failures can co-occur; the mechanisms differ.

Why it happens

The reader listens for accessibility events and DOM mutations, then chooses a patch or a full recopy. Full rebuilds are expensive, so they are coalesced, delayed, and sometimes missed. If the framework repaints a canvas, replaces an iframe, or changes pixels on a layer the reader does not subscribe to, the event pipe is empty and the buffer keeps the old snapshot. JAWS is “stickier” about web buffering; NVDA follows the tree more closely; both will briefly speak the previous page’s skeleton after a single-page route change.

The second layer is cursor placement. Rebuild does not only swap text; it has to decide where the virtual cursor lands. If focus is not moved onto the new content, the cursor may stay pinned to a node that has vanished — silence, a jump to the top, or a repeat of a sentence that is gone. The user’s manual refresh command (Insert+Esc in NVDA/JAWS) is a human patch for that rebuild.

Studying it

Run an in-place replacement with no full reload: apply a filter, change route, submit and swap in a result list. Do not touch the reader’s refresh key. Immediately arrow onward from the old position and compare speech to the tree now in the inspector. Add a cell that moves focus to the new heading after the swap. Use NVDA+Firefox and JAWS+Chrome; the stale window on the same SPA is often different lengths.

Independent variables: update method (innerHTML block replace / per-node patch / canvas redraw), whether focus moves, reader. Dependent variables: whether speech still contains old nodes, where the cursor lands, whether a manual refresh is required to match the inspector.

Where it stops holding

Mobile readers bind more live to the accessibility API, so stale buffering is less typical than on Windows web — which does not prove they never speak the previous screen; route animations still clip in a leftover sentence. Real-time games and ticker updates that would rebuild every frame get throttled; staleness is then a performance policy, not a bug. Cross-origin iframes, shadow roots, and extension-injected nodes often drop off the mutation subscription. If the user is mid-keystroke in focus mode, the reader may defer rebuild so the caret is not yanked.

Applying it

  • After replacing main content, move focus to the new region’s heading or container so the tree update is visible to the reader and the cursor has a landing place.
  • Do not fake a content change with a canvas or a purely visual transition; the new content must appear as accessibility nodes, not only as paint.
  • On long-lived single-page apps, check after critical route changes that old landmarks are no longer spoken.
  • How to check: change a client-side route, cover the screen, arrow immediately, and do not press refresh. If the previous page’s heading or button is still heard, the buffer did not follow. Repeat in JAWS and NVDA and note which one needs a manual Insert+Esc.

Related

  • Same group: J5.09.1 Screen readers speak from a virtual buffer, not from pixels · J5.09.2 Browse mode and focus mode bind the same keys to different jobs · J5.09.3 Buffer order follows document structure, not CSS visual position
  • Nearby: J5.12 Live regions and dynamic announcements · J5.07 Compatibility testing
  • Search terms: virtual buffer refresh · off-screen model · stale buffer

Cards in the same group

Quick Actions

Share

Share this page

ios_share

https://hci.top/en/handbook/J5.09.4