[whatwg] Menus, fallback, and backwards compatibility: ideas wanted

Matthew Raymond mattraymond at earthlink.net
Sat Dec 3 03:57:29 PST 2005

Anne van Kesteren wrote:
> Another idea I had was to make the first <option> element when it has a
> particular ancestor element a label. So instead of saying it explicitly 
> it gets
> its semantics from where it appears.
> <cmd>
>   <option>this is the label
>   <select>
>    <option>this is not
>   </select>
> </cmd>

I don't see why we can't just have <cmd> be a "command menu" and use
<menulabel> for it:

| <menulabel for="foo"><label for="sel1">Menu Label</label></menulabel>
| <cmd id="foo">
|   <select id="select">
|    <option>Item 1
|    <option>Item 2
|    <option>Item 3
|   </select>
|   <button>Go</button>
| </cmd>

   Without fallback, this would be the following:

| <menulabel for="foo">Menu Label</menulabel>
| <cmd id="foo">
|  <option>Item 1
|  <option>Item 2
|  <option>Item 3
| </cmd>

   I've got a better idea, though. If we're trying to make <cmd> similar
to <datalist>, why not just use <datalist>?

| <menulabel>
|   <label for="bar">Label for Menu</label>
|   <menu list="foo"/>
| </menulabel>
| <datalist id="foo">
|   <select id="bar">
|     <option>Item 1</option>
|     <option>Item 2</option>
|     <option>Item 3</option>
|   </select>
|   <button type="submit">Go</button>
| </datalist>

   As you can see, <menu> uses the |list| attribute from Web Forms 2.0
to load data from a <datalist>. Since <menulabel> is associated with a
<menu> element, there's no change in its semantics. With the exception
of the <button> element, the use of <datalist> is pretty much how it is
used in WF2.

> ... or:
> <cmd>
>   <select>
>    <option>this is the label
>   </select>
> </cmd>

   We're running into too many possible sources for adding labels. If
you include this we have:

* A child <option>.
* The first <option> in the child <select>.
* A child text node.
* A child <label> node.
* A child <button>.

   I think it's cleaner to just have a <menulabel> associated with the
<cmd> and treat <cmd> like a type of menu. As you saw above, the
fallback is not difficult (though perhaps a little heavy on the markup).

>>So we've completely reinvented <menu><select/></menu>, only using
>><cmd> as the parent instead. Why not just return to using
>><menu><select/></menu> then?
> As noted earlier in this thread <cmd> was just some random name that has to be
> replaced at some point, not? Anyway, I think <menu> should be reserved for
> dropdown lists, but I don't feel strongly about that.

   With the use of <datalist>, I don't see a point in having separate
markup for various menu types. You only need specialized markup for the
specific areas where they are different:

For menu bars:
| <menubar>
|   <menulabel>
|     Menu 1
|     <menu/>
|   </menulabel>
|   <menulabel>
|     Menu 2
|     <menu/>
|   </menulabel>
| </menubar>

For command menus:
| <menulabel>
|   Command Menu Name
|   <menu/>
| </menulabel>

For context menus:
| <textarea name="ta1" context="foo"></textarea>
| <menu id="foo" label="edit"/>

   Without the <option> element to worry about, and with a version of
<command> that goes in the <head> instead of a <menu>, we can limit the
immediate children of <menu> to <li> elements like we do with other
lists. Therefore, the following gives an idea of what markup to expect
for <menu>:

| <menu>
|   [<commandset>]
|     <li>Item Name</li>
|     <li><label><input type="radio | checkbox">Item Name</label></li>
|     <li>
|       <input type="radio | checkbox">
|       <label for>Item Name</label>
|     </li>
|     <li><input type="submit" value="Item Name"></li>
|     <li><button type="submit">Item Name</button></li>
|     <li><a href>Item Name</a></li>
|     <li><menulabel>Item Name<menu></menu></menulabel></li>
|     <li><menulabel for>Item Name</menulabel>[<menu></menu>]</li>
|     <li><hr></li>
|   [</commandset>]
| </menu>

More information about the whatwg mailing list