Three actions, each built three ways. The real ones are plain HTML; the fakes are a span or div with a click handler.
| Action | Real link | Real button | Fake |
|---|---|---|---|
| Go to another page | Open the help pagethe right element | a form with no fields | Open the help pagea span that sets location |
| Jump to a part of this page | Jump to the resultsthe right element | No plain-HTML waya button needs script to scroll | Jump to the resultsa span that calls scrollIntoView() |
| Show a note | Show the notea fragment link and :target |
the right element: popovertarget |
Show the note a div that toggles hidden |
The link's note. Look at the address: it now ends in #link-note, and the back button hides this note again.
The fake's note. It appeared, but nothing told a screen reader that the control was a button, or that it changed anything.
What Chrome, Firefox and Safari do on a desktop. "Yes" means the browser provides it with no script.
| Control | Tab reaches it | Enter | Space | Middle-click, copy link | Announced as |
|---|---|---|---|---|---|
| Real link | Yes | Yes | No: scrolls the page | Yes | link |
| Real button | Yes | Yes | Yes | No | button |
Fake span or div | No | No | No | No | plain text |
The fakes work for exactly one person: someone using a mouse, clicking with the main button, who never wants a second tab. Each "No" in the last row is a feature the fake's author would have to build by hand.