いろいろな方法があるかと思いますが、一例として、要素のindexと、jQueryの関数とループを使う方法はいかがでしょうか?
例えば HTML は、以下のように、内容div
全てをid=“contents”
のdiv
で囲みます。そして、内容のdiv
と、それと対応するoption
が、各親要素内で同じ番号順になるように配置します。
北海道option
は、#area select
要素内で1番目、
そして北海道の内容である、
ラーメンp
を含むdiv
は、#contents div
要素内で1番目、
というようにです。
html
1<select name="area", id="area">
2 <option value="北海道">北海道</option>
3 <option value="東北">東北</option>
4 <option value="関東">関東</option>
5 <option value="北陸">北陸</option>
6 <option value="関西">関西</option>
7</select>
8<br>
9<div id="contents">
10 <div>
11 <p>ラーメン</p>
12 </div>
13 <div>
14 <p>ずんだ餅</p>
15 </div>
16 <div>
17 <p>餃子</p>
18 </div>
19 <div>
20 <p>お刺身</p>
21 </div>
22 <div>
23 <p>お好み焼き</p>
24 </div>
25</div>
そして、scriptは以下のように書きます。
jQuery
1$(function(){
2
3 function displayContentOf(selectedIndex) {
4 if (! Number.isInteger(selectedIndex) || selectedIndex < 0) {
5 return;
6 }
7 $('#contents').children().each(function(index) {
8 if (index === selectedIndex) {
9 $(this).show();
10 } else {
11 $(this).hide();
12 }
13 })
14 }
15
16 const defaultIndex = 0;
17 $('#area').selectedIndex = defaultIndex;
18 $('#area').val('北海道');
19 displayContentOf(defaultIndex);
20
21 $('#area').change(function (e) {
22 const selectedIndex = e.currentTarget.selectedIndex;
23 displayContentOf(selectedIndex);
24 });
25
26});
これなら、仮にHTMLでエリアや内容を追加したり順番を入れ替えても、scriptは変更する必要がありません。
ただし、select
内のエリアoption
と、#contents div
内の内容div
の並び順を、必ず一致させる必要があります。
また、初期表示するエリアを変更した場合は、scriptのデフォルト値の部分を書き直す必要があります。
が、if
文で個別に内容div
を指定して書くよりは、変更時の手間が大分省けるのではないでしょうか。
なお、上のHTMLの例では内容div
の属性は不要だったので消しましたが、もちろん他でご入用の場合は、内容のdiv
やp
にid
やclass
などの属性を追加していただいても大丈夫です。
それと、#contents div
内の子div
要素は全て、cssでdisplay:none
と設定しておくのがおすすめです。ページを開いた直後に全エリアの全内容が一瞬表示されてしまうチラつき現象が無くなりますので。cssで全非表示にしておき、jQueryで必要な部分だけ表示する、という流れです。
ご参考までに、以下に、詳しい解説コメント付きのコードも添えておきます。コード自体は、上記のscriptと同じです。
jQuery
1$(function(){
2
3 // 選択エリアの内容を表示する関数
4 function displayContentOf(selectedIndex) {
5
6 // 引数の値が整数でない場合、または0以下の場合は何もしない
7 if (! Number.isInteger(selectedIndex) || selectedIndex < 0) {
8 return;
9 }
10 // 以下、selectedIndexの値は正の整数であることが保証されるため安全に使える
11
12 // contents div内にある 各子要素divをループを使って1つ1つ順に処理する
13 $('#contents').children().each(function(index) {
14 /**
15 * この引数indexは、処理する順番がきた子要素divが、
16 * #contents div要素内で何番目の子にあたるかを示す番号.
17 * 開始番号は 0. つまり、
18 * ラーメンpを含むdivは index 0
19 * ずんだ餅pを含むdivは index 1
20 * ここの処理では直接は関係しないが参考までに、#area select要素内で、
21 * 北海道optionは index 0
22 * 東北optionは index 1
23 * ..というように、同じ並びで同じ番号をもつため、それを利用する
24 */
25
26 // もしも子要素divのindexが、selectの選択中indexと同じ番号であれば、
27 if (index === selectedIndex) {
28 // divを表示する
29 $(this).show();
30
31 } else {
32 // それ以外のdivである場合は非表示にする
33 $(this).hide();
34 }
35 /**
36 * ここのthisは、#contents div要素の子要素div 1つを示す
37 */
38 })
39 }
40
41 // ページを開いた直後のデフォルト表示を設定
42 const defaultIndex = 0;
43 $('#area').selectedIndex = defaultIndex;
44 $('#area').val('北海道');
45 displayContentOf(defaultIndex);
46 /**
47 * selectedIndexを設定しただけでは、そのoptionが表示されないため、
48 * val()でvalueを指定して、selectの中にoption値を表示させる
49 */
50
51 // select要素の値が変更されたら、
52 $('#area').change(function (e) {
53
54 // 選択中のindex番号を取得する
55 const selectedIndex = e.currentTarget.selectedIndex;
56 /**
57 * selectedIndexは、
58 * select要素の中で、選択されたoptionが何番目にあるか、を示す番号.
59 * ユーザーがselect要素を操作して変更すると、自動で設定される.
60 * indexの開始番号は、0(※ 1ではないので注意)
61 */
62
63 // 選択エリアの内容を表示する関数を実行
64 displayContentOf(selectedIndex);
65 });
66
67});
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。