セレクトメニューが2つあって、1つ目のセレクトメニューを選択したら、その値によって2つ目のセレクトメニューの選択肢を入れ替えるというものです。
わざわざ何番煎じか分からないネタを遇えて取り上げたのは、巷でよく見かける「配列にデータを入れて出力する」という方法ではなく、Validなソースでこれをやりたかったためです。
選択肢がやたらと多くなりがちなもの、たとえば県から市を選んだりするフォームなどでよく使われていると思います。
とりあえずセレクトメニュー2つだけ連動させてみました。
XHTML
連動させるセレクトメニューにそれぞれIDが必要。
親セレクトメニューのoption要素につけたクラス名と、子セレクトメニューのoptgroup要素のクラス名を同じにします。
optgroup内に入れた要素が選択された時に入れ替わる選択肢になります。
<label for="select">選択肢1</label>
<select name="select" id="select">
<option value="果物" class="fruit">果物</option>
<option value="肉" class="meat">肉</option>
<option value="魚" class="fish">魚</option>
</select>
<label for="select2">選択肢2</label>
<select name="select2" id="select2">
<optgroup class="fruit" label="果物">
<option value="リンゴ" selected="selected">リンゴ</option>
<option value="みかん">みかん</option>
<option value="ぶどう">ぶどう</option>
<option value="桃">桃</option>
</optgroup>
<optgroup class="meat" label="肉">
<option value="m1">牛肉</option>
<option value="m2">豚肉</option>
<option value="m3">鶏肉</option>
</optgroup>
<optgroup class="fish" label="魚">
<option value="maguro">マグロ</option>
<option value="sisyamo">ししゃも</option>
<option value="iwashi">イワシ</option>
<option value="sanma">サンマ</option>
</optgroup>
</select>
見ての通り普通にソース書くのとそう変わらんので、javscriptオフでもフォームは機能します。
option要素を持たないselectを作る必要もないからバリデートに怒られる心配もない。
optgroupのラベルはどっちでもいい。
続きを読む