Do not hardwire single-character keyboard shortcuts
One key does something. Press S and a search box opens, press K and a message gets archived, with no way to turn it off and no way to change it. F99 is the failure technique for that, so a match is a defect rather than a feature you can defend on the rule. Three routes clear it and you need only one. Let the user switch shortcuts off, let them remap the shortcut so it includes a non-printing key like Ctrl or Alt, or make the shortcut live only while a particular component holds focus. That last route is why a listbox that jumps to items by first letter is fine. And Shift counts. Shift plus a character is still a character key shortcut here, which is the half most teams have never tested.
How we find it in an audit
The quickest route is asking the developers which shortcuts exist, and that is W3C's own first step, because a trusted answer beats pressing every key on the board. Where nobody knows, we press every key on the board. Focus goes to an empty part of the page first, then every printing character gets a press, then the whole set again with Shift held down. Modifier keys, arrows, function keys, Space, Enter, Tab and Delete stay out of it. Reading the source for keydown listeners narrows the search and settles nothing, since a character shortcut can be built several ways and none of them has to look like the others.
How affected users experience it
Speech input is where this bites hardest. Dictation feeds characters into the page one at a time, so a single stray word can fire five shortcuts before the sentence is finished, and every one of them has to be found and undone before typing can carry on. People who type with a head pointer or a mouth stick meet the same problem from another direction, because a slipped key is a command rather than a typo. Both groups usually stop using the site rather than keep fighting it.
Passes vs. fails
Passes
document.addEventListener("keydown", (e) => {
if (e.key === "k" && settings.shortcutsEnabled) archive();
});
// settings offer a toggle to disable shortcuts and a way to remap themFails
document.addEventListener("keydown", (e) => {
if (e.key === "k") archive();
});How this gets tested
The W3C publishes test rules that define what a checker looks for here.
- No keyboard shortcut uses only printable charactersA tool finds candidates, you decide
The other techniques filed under this rule
2 guides on this site are filed under 2.1.4 Character Key Shortcuts. W3C documents this one as a failure of that rule, so it describes a way the rule gets broken rather than a way to pass it.
This guide is our interpretation of W3C technique F99: Failure of Success Criterion 2.1.4 due to implementing character key shortcuts that cannot be turned off or remapped. W3C publishes its techniques as guidance rather than as the standard, and says so on every one of them. The success criterion is what conformance is measured against, and a technique is one documented way to meet it.