menu 要素
4.11.4 menu 要素
Status: Last call for comments
- カテゴリー
- フロー・コンテンツ
- この要素の
type属性が toolbar 状態にある場合:インタラクティブ・コンテンツ - この要素を使うことができるコンテキスト:
- フロー・コンテンツが期待される場所
- コンテンツモデル:
- 0 個以上の
li要素、または、 - フロー・コンテンツ、のいずれか
- コンテンツ属性:
- グローバル属性
typelabel- DOMインタフェース:
-
interface HTMLMenuElement : HTMLElement { attribute DOMString type; attribute DOMString label; };
menu 要素は、コマンドのリストを表します。
type 属性は列挙属性で、宣言されているメニューの種類を示します。この属性は3つの状態を持ちます。context キーワードは、context menu 状態に相当し、この要素はコンテキスト・メニューであると宣言するものです。toolbar キーワードは、tool bar 状態に相当し、この要素はツールバーであると宣言するものです。この属性は省略することもできます。省略された場合のデフォルトは list 状態となり、この要素はただ単にコマンドのリストに過ぎず、コンテキスト・メニューを宣言するものでも、ツールバーを定義するものでもありません。
menu 要素の type 属性が context menu 状態にあるなら、この要素はコンテキスト・メニューのコマンドを表します。ユーザーは、そのコンテキスト・メニューが有効となっているなら、そのコマンドを実行することができます。
menu 要素の type 属性が toolbar 状態にあるなら、この要素は、ユーザーがすぐに実行することができる有効なコマンドのリストを表します。
menu 要素の type 属性が list 状態にあるなら、この要素は非順序の項目リストを表します(それぞれの項目は li 要素で表されます)。それぞれの項目は、ユーザーが実行したり、有効化することができるコマンドを表します。この要素の子要素に li 要素がなければ、利用可能なコマンドを説明するフロー・コンテンツを表します。
label 属性は、メニューのラベルを与えます。これは、ユーザーエージェントがUIでネストしたメニューを表示するために使われます。例えば、コンテキストメニューに、もう一つメニューを含んでいる場合、ネストしたメニューの label 属性を、サブメニューのラベルとして使うでしょう。
type と label IDL 属性は、同じ名前の対応するコンテンツ属性を反映しなければいけません。
4.11.3.1 イントロダクション
Status: Last call for comments
この節は、非規程です。
menu 要素は、コンテキスト・メニューやツールバーを定義するために使われます。
例えば、次は3つのメニューボタンを伴ったツールバーを表します。それぞれのボタンには、一連の選択肢を伴ったドロップダウン・メニューがあります:
<menu type="toolbar"> <li> <menu label="File"> <button type="button" onclick="fnew()">New...</button> <button type="button" onclick="fopen()">Open...</button> <button type="button" onclick="fsave()">Save</button> <button type="button" onclick="fsaveas()">Save as...</button> </menu> </li> <li> <menu label="Edit"> <button type="button" onclick="ecopy()">Copy</button> <button type="button" onclick="ecut()">Cut</button> <button type="button" onclick="epaste()">Paste</button> </menu> </li> <li> <menu label="Help"> <li><a href="help.html">Help</a></li> <li><a href="about.html">About</a></li> </menu> </li> </menu>
対応ブラウザでは、次のように表示されるでしょう:

古いブラウザでは、3つの項目を伴った黒丸付きのリストのように見えるでしょう。最初の項目には4つのボタンが、2つ目の項目には3つのボタンが、3つ目の項目には、リンクから構成される項目を伴った黒丸が2つネストするはずです。
次では類似のルールバーを実装しています。選択した値に応じてウェブ・サイトにユーザーをリダイレクトするボタンが一つあります。
<form action="redirect.cgi">
<menu type="toolbar">
<label for="goto">Go to...</label>
<menu label="Go">
<select id="goto">
<option value="" selected="selected"> Select site: </option>
<option value="http://www.apple.com/"> Apple </option>
<option value="http://www.mozilla.org/"> Mozilla </option>
<option value="http://www.opera.com/"> Opera </option>
</select>
<span><input type="submit" value="Go"></span>
</menu>
</menu>
</form>
対応ブラウザにおけるビヘイビアは、前述の例に似ていますが、ここでは、古いブラウザのビヘイビアは、サブミット・ボタンを伴った select 要素ひとつから構成されます。このサブミット・ボタンは、ツールバーには現れません。なぜなら、そのボタンは、menu 要素、または、その子である li 要素の直下の子ではないからです。
4.11.3.2 メニューとツールバーの生成
Status: Last call for comments
メニュー(またはツールバー)は、0 個以上の次に示すコンポーネントのリストで構成されます:
- コマンド、デフォルトのコマンドとしてマークすることができます。
- セパレータ
- 他のメニュー(ネストしたリストが可能です)
特定の menu 要素に相当するリストは、その子ノード上を反復することによって生成されます。ツリー順に取り出されたそれぞれの子ノードに対する必須の挙動は、そのノードが何かに依存します。それは次の通りです:
- コマンドを定義する要素
- メニューにコマンドを加え、そのファセットを表します。
hr要素- 空文字列がセットされた
value属性を持ち、disabled属性を持ち、textContentが1つ以上のハイフン(U+002D HYPHEN-MINUS)の文字列から構成されるoption要素 - メニューにセパレータを加えます。
li要素label要素- その要素の子要素上を反復します。
label属性を持たないmenu要素select要素- メニューにセパレーターを加え、子要素のうち
menu要素またはselect要素上を反復します。それから、もう一つセパレーターを加えます。 label属性を持つmenu要素label属性を持つoptgroup要素- メニューにサブメニューを加えます。この要素の
label属性をメニューのラベルとして使います。サブメニューは、その要素を使って新しいメニューを生成することで構築されなければいけません。この完全な手順は次の節で説明します。 - その他のノード
- そのノードを無視します。
前述の処理が全てのノードに対して終了したら、ユーザーエージェントは、下記の通り、該当のメニューに後処理を施さなければいけません:
- セパレータを除いて、ラベルがないメニュー項目を削除しなければいけません。そのラベルが空文字の場合も該当します。
- 1行に2つ以上連続したセパレーターがあれば、それを一つにまとめなければいけません。
- メニューの最初と最後のセパレーターを削除しなければいけません。
4.11.3.3 コンテキストメニュー
Status: Last call for comments
contextmenu 属性は、要素のコンテキスト・メニューを与えます。この値は DOM における menu 要素の ID でなければいけません。この属性値を引数にして getElementById() メソッドを呼び出して得られたノードが null または menu 要素でないなら、その要素には、割り当てられたコンテキスト・メニューを持ちません。そうでなければ、その要素は、コンテキスト・メニューが割り当てられたと認識された要素です。
要素のコンテキスト・メニューがリクエストされたとき(例えば、ユーザーが要素を右クリックしたり、コンテキスト・メニュー・キーを押したとき)、ユーザーエージェントは、メニューがリクエストされた要素で contextmenu という名前のシンプルなイベントを発出しなければいけません。
ゆえに、通常は、contextmenu イベントの発出は、mouseup や keyup イベントのデフォルト・アクションとなるでしょう。イベントの正確なシーケンスはユーザーエージェントに依存しますが、プラットフォームの慣例に基づいて異なってくるでしょう。
contextmenu イベントのデフォルト・アクションは、その要素にコンテキスト・メニューが(contextmenu 属性を使って)割り当てられているのかそうでないのかに依存します。もし割り当てられていなければ、そのデフォルト・アクションは、デフォルトのコンテキスト・メニューがあるのであれば、それを見せることです。
この要素、もしくはその祖先の一つにコンテキスト・メニューが割り当てられているなら、ユーザーエージェントは、コンテキスト・メニューが割り当てられている祖先のうち直近のコンテキスト・メニューの menu 要素(自分自身の要素も含む)で、show という名前のシンプルなイベントを発出しなければいけません。
このイベントのデフォルト・アクションは、menu 要素から構築したコンテキスト・メニューをユーザーエージェントが表示することです。
ユーザーエージェントは、デフォルトのコンテキスト・メニューがあれば、それへのアクセス手段を、すでに表示済みのコンテキスト・メニューとともに提供することも可能です。例えば、二つのメニューのメニュー項目をマージしたり、ページのコンテキスト・メニューをデフォルトのメニューのサブメニューとして提供することができます。
ユーザーが何も選択せずにメニューを閉じたら、特に何も起こりません。
ユーザーがコマンドを表すメニュー項目を選択したら、ユーザーエージェントは、そのコマンドのアクションを呼び出さなければいけません。
コンテキスト・メニューは、表示されている間は、DOM の変更を反映してはいません。それらは、show イベントのデフォルト・アクションとして構築され、閉じられるまでそのままにしておかなければいけません。
ユーザーエージェントは、コンテキスト・メニューの処理モデルをバイパスする手段を提供することができます。こうすることで、ユーザーはいつでも確実にユーザーエージェントのデフォルトのコンテキスト・メニューにアクセスすることができるようになります。例えば、Shift キーを押しながらの右クリックしたら、contextmenu イベントが発出されず、その代わりに、常にデフォルトのコンテキスト・メニューを表示する、といったことをユーザーエージェントはハンドリングすることができます。
contextMenu 属性は、contextmenu コンテンツ属性を反映しなければいけません。
これは、入力コントロール用のコンテキスト・メニューの例です:
<form name="npc"> <label>Character name: <input name=char type=text contextmenu=namemenu required></label> <menu type=context id=namemenu> <command label="Pick random name" onclick="document.forms.npc.elements.char.value = getRandomName()"> <command label="Prefill other fields based on name" onclick="prefillFields(document.forms.npc.elements.char.value)"> </menu> </form>
これは、コントロールのコンテキスト・メニューに、"Pick random name"、"Prefill other fields based on name" という項目を追加しています。これらは、上記の例には書かれていないスクリプトを呼び出します。
4.11.3.4 ツールバー
Status: Last call for comments
menu 要素が toolbar 状態にある type 属性を持つとき、ユーザーエージェントは、その menu 要素に対してメニューを構築しなければいけません。そして、それをレンダリングに反映しなければいけません。
ユーザーエージェントは、 menu 要素の DOM に変更があったら、すぐに該当のメニューを再構築して、その変更を反映しなければいけません。
※ 原文:http://www.w3.org/TR/2010/WD-html5-20100624/interactive-elements.html#menus