Unobtrusive and keyboard accessible connected select boxes
Any web developer who has created a reasonably complex form is probably aware of the concept of multiple select
elements that are connected – choosing something from one select box either makes a new select box appear or changes the options of one that is already visible.
There are usually two problems with this approach. One is that most implementations are completely dependent on JavaScript being available. Often there either is no submit button at all, or there is a submit button but without JavaScript there is no way to access the options that appear only as a result of changing the first select box. The other problem is that in some browsers, using the cursor keys to change the selected option triggers the onchange event immediately, so you can never get past the first option unless you know how to use your keyboard to display all options.
I normally work around these problems by requiring users to submit the form to get the next set of options from the server. Obviously that isn’t an ideal solution either. So what other options do we have? One option that looks promising is described by Christian Heilmann in Unobtrusive connected select boxes - yet another solution approach. It involves using optgroup
elements to create a two-level select box, which is then split into two separate select boxes if JavaScript is available. Neat.
The solution Chris describes solves (or at least mitigates) the keyboard access problem since it doesn’t reload the page when the onchange
event is triggered. And if JavaScript is unavailable, there is a single select box with option groups.
The catch is that nested optgroup
elements are not allowed in current versions of HTML, so this will not work when more than two connected select boxes are needed. Nested optgroup
elements are allowed in the current Web Forms 2.0 Working Draft, so I guess there is a reasonable chance of that change making it into HTML 5.
- Previous post: Adding vs. not removing accessibility
- Next post: How to prevent HTML tables from becoming too wide