Dialog has no accessible name: how to fix it
A dialog without an accessible name confuses screen readers and AI agents. Learn how to name modals correctly and pass Agent-readiness checks.
What it means
A dialog is an interactive overlay (modal, popup, or panel) that lacks an accessible name. The name can come from an explicit aria-label or aria-labelledby attribute, or from visible text content inside the dialog. Without it, screen readers announce the dialog as an unnamed region and crawlers can't identify its purpose.
Why it matters
An unnamed dialog breaks the DOM tree that Googlebot and screen readers both consume. This can cause the dialog's content to be treated as boilerplate or duplicate rather than main content, reducing its indexing weight. For AI retrieval, unnamed dialogs are harder to extract and cite because the system can't determine what the overlay is actually about.
How to fix it
- Add an aria-label attribute with a descriptive name: <div role="dialog" aria-label="Newsletter signup">...
- Or use aria-labelledby pointing to the heading that names the dialog: <div role="dialog" aria-labelledby="dialog-title">
- Ensure the dialog has visible text (not just an icon) so the accessible name is also visible to users.
- Verify the dialog is focusable and keyboard-operable (tab to enter, Escape to dismiss).
Example
<div role="dialog">
<button>×</button>
...
</div><div role="dialog" aria-labelledby="dlg-title">
<h2 id="dlg-title">Newsletter signup</h2>
<button aria-label="Close">×</button>
...
</div>Name the dialog with aria-labelledby (pointing to its heading) or aria-label so screen readers and agents can announce what it is.
When it's not a problem
If the dialog is purely decorative (e.g., a loading spinner or a full-screen background overlay with no interactive content), you can use aria-hidden="true" or role="presentation" and the warning becomes a false alarm. Also fine when the dialog is triggered by a button and the button itself carries the accessible name via aria-label or visible text.
How Crawlinx detects it
We check elements with role="dialog" for an accessible name from aria-label, aria-labelledby, or inner text. Dialogs with none are counted and reported.
How common is it?
95 audited sites in our corpus currently show this issue. The breakdowns below show which platforms, gatekeepers, verticals and countries are most exposed.
Audit your own site — free
157 checks, internal PageRank, render-diff. No signup, results in ~30s.