[whatwg] Menus, fallback, and backwards compatibility: ideas wanted
Ian Hickson
ian at hixie.ch
Sun Nov 27 00:00:56 PST 2005
So... menus.
I've spent the last few days carefully examining all the posts on context
menus that have been sent to the list (mainly Matthew Raymond's excellent
proposals), as well as looking at the current draft in the spec, and real-
world markup on major sites.
There are four main use cases for menus on the Web, as far as I can tell
(please let me know if you can think of another case):
1. Providing a menu bar for the entire window (or application, on Mac), so
that the application can be a native-like application. This, IMHO, is
out of scope for HTML5 and should maybe be revisited in HTML6 by
whoever does the work on taking HTML out of the browser, if that ever
happens.
2. Replacing ad-hoc DHTML menus with something accessible yet stylable.
Sites like kelloggs.com and target.com are great examples of such
menus and their problems today.
3. Replacing ad-hoc menu buttons, as seen in the folder view of Yahoo!
mail (the "Mark" button, for instance) or of msn Hotmail (the "Put in
Folder" button, for instance), and abuse of the <select> widget to
get similar effects, as seen in GMail (the "More Actions..." dropdown,
for instance) or United Media's comics sites (the "Comics List"
dropdown on, e.g., dilbert.com), with something more accessible.
4. Replacing ad-hoc DHTML context menus with something more accessible,
that doesn't necessarily replace the UA's own context menus.
If we ignore 1 as being out of scepe, then we see that 2, 3, and 4 are
really just variations on the same theme. For example, menu buttons are,
in practice, just attempts to make context menus more discoverable; the
only difference is how you invoke them. Furthermore, most DHTML menus
consist of just a lot of menu buttons side by side.
So to simplify, the use cases we want to cover are context menus,
discoverable context menus, and sets of discoverable context menus.
Our requirements for how to design the markup for this are the usual
requirements:
A. It has to have graceful fallback in older UAs (ideally, in this case,
the ability to have fully functional fallback no worse than today's).
B. It has to have a sane migration path from the old-style markup to the
new kind of markup.
C. It has to have no requirements that would cause old pages to have
different behaviour in UAs that support HTML5 compared to those that
exist today.
D. It has to be reasonably clean markup, easy to understand and author.
E. It has to be reasonably easy to implement.
D and E imply that we should avoid overloading semantics (e.g. we should
avoid reusing an existing element that already has baggage, like taking
<select> and saying "if it has this magical attribute, it's actually a
menu button" or some such).
Matthew has pretty much convinced me that trying to grandfather the
current DHTML menu syntaxes into the new markup is not worth it, so we
can ignore that requirement.
I think the current core menu stuff (<command>, how to build menus, etc)
is reasonable. The big problem with the current proposal is how to do the
fallback in a sane way.
I'd really like to be able to fall back on the <select onchange=""> abuse,
since it is easy to define how to make a menu from that, but I don't want
to just put an attribute on the <select> element to change its behaviour
-- it's got to still be a <select>, just one that happens to not be
visible in new UAs, with its semantics wrapped around another level of
semantics. The problem is trying to come up with a neat way of doing this
while still hitting all the requirements above.
Take this markup from today:
<p>Action: <select onchange="..."><option>...<option>...</select></p>
Here are some possible ways we could do this:
<p>
<button menu="x">Action...</button>
<menu id="x"><a href="">...</a> <a href="">...</a></menu>
</p>
(<menu id> would cause the <menu> to hide in new UAs.) This sucks for two
reasons: forced indirection, and the fallback story is poora at best.
<p>
<button>
Action...
<menu><a href="">...</a> <a href="">...</a></menu>
</button>
</p>
No legacy compatibility story.
<p>
<button>
Action...
<select onchange="..."><option value="..."><option value="..."></select>
</button>
</p>
Breaks in modern browsers (especially Safari, which puts the <select>
outside the button).
<p>
<menubar>
<label for="x"> Action... </label>
<select id="x" onchange="...">
...
</select>
</menubar>
</p>
Good back-compat story, but far too heavy on the markup. Suboptimal
element name <menubar>, with no obvious alternatives.
<p>
<menubar>
<label>
Action...
<select onchange="...">
...
</select>
</label>
</menubar>
</p>
A mess for implementors -- no good way to render that as a button in a
CSS world (or even in an XBL2 world, actually). Also quite misleading
semantically.
<menu label="Action">
Action...
<select onchange="...">
...
</select>
</menu>
(Where the label attr on <menu> would make the element into a menu button)
Duplication of the label, bad for i18n (can't set a different language on
part of the attribute -- though I'm not convinced that's a blocker
problem, to be honest), makes the <input type> mistake of having an
element's behaviour change radically based on an attribute (bad for
authors and implementors).
Anybody got any better ideas?
--
Ian Hickson U+1047E )\._.,--....,'``. fL
http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
More information about the whatwg
mailing list