Skip to main content
Accessibility

ARIA Live Politeness Settings

  • ARIA
  • live regions
  • assistive technology
  • dynamic content
  • screen readers

When content on a web page changes dynamically — such as a form validation message appearing, a chat notification arriving, or a stock price updating — sighted users can visually perceive the change immediately. Screen reader users, however, rely on their assistive technology to announce these updates. ARIA live politeness settings give developers precise control over when and how urgently these announcements are delivered, ensuring that dynamic updates are communicated without overwhelming or interrupting the user.

The aria-live attribute is placed on a container element that is expected to receive dynamic content. When the content inside that container changes, the screen reader detects the mutation and decides — based on the politeness setting — whether to interrupt the user immediately, wait for a natural pause, or stay silent entirely. Getting this balance right is one of the most impactful accessibility decisions a developer can make for dynamic interfaces.

Why ARIA live politeness settings matter

Dynamic content is everywhere in modern web applications: toast notifications, real-time search results, countdown timers, error messages, loading indicators, and collaborative editing updates. Without live regions, screen reader users are completely unaware that any of these changes have occurred. They would need to manually navigate back to the changed area to discover new content, which is impractical and often impossible when changes are frequent.

Choosing the wrong politeness level creates its own problems. If every minor update is marked as assertive, the screen reader will constantly interrupt the user mid-sentence, making the page unusable. If critical error messages are marked as polite, users might complete and submit a form before ever hearing that a validation error appeared. The politeness setting is the mechanism that lets developers match announcement urgency to the actual importance of the content change.

These settings affect all screen reader users across platforms — JAWS, NVDA, VoiceOver, TalkBack, and others — making them a foundational part of WCAG 2.1 compliance, particularly Success Criterion 4.1.3 (Status Messages).

How ARIA live politeness settings work

The three values

The aria-live attribute accepts three values:

  • off — The default. Changes to the region are not announced. The user can still navigate to the content manually, but the screen reader will not proactively read updates. Use this for content that updates very frequently (like a clock) where announcements would be disruptive.
  • polite — The screen reader waits until it finishes its current announcement or the user pauses, then reads the new content. This is the most commonly appropriate setting for non-urgent updates like status messages, search result counts, or informational notifications.
  • assertive — The screen reader interrupts whatever it is currently saying to announce the change immediately. Reserve this for truly urgent messages like error alerts, session timeout warnings, or critical system notifications.

Supporting attributes

Several companion attributes refine how live region updates are communicated:

  • aria-atomic — When set to true, the entire contents of the live region are announced on any change, not just the nodes that changed. When false (the default), only the changed nodes are read.
  • aria-relevant — Controls which types of mutations trigger an announcement: additions, removals, text, or all. The default is additions text.
  • aria-busy — When set to true, tells the screen reader to hold off announcements until the region is done updating. Set it back to false when the batch update is complete.

Implicit live regions

Some ARIA roles come with built-in live region behavior. Elements with role="alert" implicitly have aria-live="assertive" and aria-atomic="true". Elements with role="status" implicitly have aria-live="polite". Elements with role="log" implicitly have aria-live="polite" with aria-relevant="additions".

Timing requirement

The live region container must exist in the DOM before the dynamic content is injected. If you dynamically create both the container and its content at the same time, many screen readers will fail to detect the change and will not make an announcement.

Code examples

Bad example — no live region on a dynamic status message

<form>
  <label for="email">Email</label>
  <input type="email" id="email">
  <button type="submit">Subscribe</button>
<!-- This message is injected by JavaScript, but screen readers won't announce it -->

  <div id="status-message"></div>
</form>

<script>
  document.querySelector("form").addEventListener("submit", (e) => {
    e.preventDefault();
    document.getElementById("status-message").textContent = "You have been subscribed successfully.";
  });
</script>

In this example, sighted users see the confirmation, but screen reader users receive no notification that the submission succeeded.

Bad example — overusing assertive for non-critical content

<div aria-live="assertive" id="search-count"></div>

<script>
  // Fires on every keystroke in a search field — constantly interrupts the user
  searchInput.addEventListener("input", () => {
    document.getElementById("search-count").textContent = `${results.length} results found`;
  });
</script>

Using assertive here means every single keystroke interrupts the screen reader, making it nearly impossible for the user to type.

Good example — polite live region for search results

<label for="search">Search articles</label>
<input type="text" id="search">
<div aria-live="polite" aria-atomic="true" id="search-count"></div>

<script>
  const searchInput = document.getElementById("search");
  let debounceTimer;
  searchInput.addEventListener("input", () => {
    clearTimeout(debounceTimer);
    debounceTimer = setTimeout(() => {
      const count = getFilteredResults().length;
      document.getElementById("search-count").textContent = `${count} results found`;
    }, 500);
  });
</script>

Here, aria-live="polite" waits for a pause before announcing, aria-atomic="true" ensures the full phrase is read, and debouncing prevents excessive updates.

Good example — assertive alert for a critical error

<!-- Container exists in the DOM before content is injected -->

<div role="alert" id="error-banner"></div>

<script>
  function showCriticalError(message) {
    document.getElementById("error-banner").textContent = message;
  }

  // Called when session is about to expire
  showCriticalError("Your session will expire in 60 seconds. Save your work now.");
</script>

Because role="alert" implies aria-live="assertive", the screen reader immediately interrupts to deliver this time-sensitive warning. The container is already in the DOM, ensuring reliable detection.

Help us improve this glossary term

Was this guide helpful?

Scan your site

Rocket Validator scans thousands of pages in seconds, detecting accessibility and HTML issues across your entire site.

🌍 Trusted by teams worldwide

Validate at scale.
Ship accessible websites, faster.

Automated HTML & accessibility validation for large sites. Check thousands of pages against WCAG guidelines and W3C standards in minutes, not days.

Scheduled Reports
API Access
Open Source Standards
$7 / 7 days

Pro Trial

Full Pro access. Cancel anytime.

Start Pro Trial →

Join teams across 40+ countries