質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1836閲覧

プルダウン変更時に表示される内容を変える場合のコードをスマートに書きたい

spbob

総合スコア9

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/09/02 02:39

プルダウンを変更した際に、表示される内容を変更する場合、以下のようなコードを書いています。

このJSの場合、同じようなコードを書いており、項目が増えた場合に間違えやすいのと
分かりにくいため、もう少しスマートな書き方にしたいのですが、わかる方教えていただけますでしょうか。
基本的な質問ですみません。。どうぞよろしくお願いいたします。

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 class="area00 active"> 10 <p>ラーメン</p> 11</div> 12<div class="area01"> 13 <p>ずんだ餅</p> 14</div> 15<div class="area02"> 16 <p>餃子</p> 17</div> 18<div class="area03"> 19 <p>お刺身</p> 20</div> 21<div class="area04"> 22 <p>お好み焼き</p> 23</div>

JQuery

1$(function(){ 2 $('.area01, .area02, .area03, .area04').hide(); 3 $('.area00').show(); 4 $('#area').change(function(e){ 5 var val = $(e.target).val(); 6 if(val == "北海道"){ 7 $('.area01, .area02, .area03, .area04').hide(); 8 $('.area00').show(); 9 }else if(val == "東北"){ 10 $('.area00, .area02, .area03, .area04').hide(); 11 $('.area01').show(); 12 }else if(val == "関東"){ 13 $('.area00, .area01, .area03, .area04').hide(); 14 $('.area02').show(); 15 }else if(val == "北陸"){ 16 $('.area00, .area01, .area02, .area04').hide(); 17 $('.area03').show(); 18 }else if(val == "関西"){ 19 $('.area00, .area01, .area02, .area03').hide(); 20 $('.area04').show(); 21 } 22 }) 23})

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

  • selectのvalueは別の用途がありそうなのでカスタムデータをもたせる
  • エリアは二重設定されることはないのでclassよりもカスタムデータにする

codepen selectbox choose

投稿2020/09/02 03:03

編集2020/09/02 03:04
yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

いろいろな方法があるかと思いますが、一例として、要素の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の属性は不要だったので消しましたが、もちろん他でご入用の場合は、内容のdivpidclassなどの属性を追加していただいても大丈夫です。

それと、#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});

投稿2020/09/02 05:49

arenomarb

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spbob

2020/09/08 01:39

みなさま。 お忙しい中、回答頂きましてありがとうございました。 分かりやすく解説をつけてくださった、arenomarbさんの回答を採用させていただきました。 こちらを実装する上でのリスクの点についても初心者で気をつけなければならないこととして、 参考にさせていただきます。 まだまだJS初心者で、一つの機能(といっていいのか分かりませんが汗)でも、 色々やり方があると思い、勉強になりました。 他に回答してくださった、yambejpさん、m.ts10806さんの回答についても参考にさせていただきます。 ありがとうございました。
guest

0

法則がなければ要件に影響のない範囲で法則を作ることです。

下記のようにvalueをコード(area_xx)と紐づければ見えてきませんか?

html

1 <option value="1">北海道</option> 2 <option value="2">東北</option> 3 <option value="3">関東</option> 4 <option value="4">北陸</option> 5 <option value="5">関西</option>

あと、1個1個指定してhide()してますが、
全部hide()して表示したいのだけshow()すれば結果は同じです。

画面ないに1つしかないのでしたらclassよりIDのほうが良いですし、こういうHTMLにしてみては。

html

1<select name="area" id="area"> 2 <option value="1">北海道</option> 3 <option value="2">東北</option> 4 <option value="3">関東</option> 5 <option value="4">北陸</option> 6 <option value="5">関西</option> 7</select> 8<br> 9<div id="area01" class="area active"> 10 <p>ラーメン</p> 11</div> 12<div id="area02" class="area"> 13 <p>ずんだ餅</p> 14</div> 15<div id="area03" class="area"> 16 <p>餃子</p> 17</div> 18<div id="area04" class="area"> 19 <p>お刺身</p> 20</div> 21<div id="area05" class="area"> 22 <p>お好み焼き</p> 23</div>

投稿2020/09/02 02:41

編集2020/09/02 03:57
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問