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

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

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

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

HTML

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

Q&A

解決済

2回答

556閲覧

JavaScriptでselect要素を変化させる方法

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2019/08/21 14:40

質問:「好きなもの」(第2セレクトボックス)の選択肢の数がフルーツとケーキで違う場合、どのような方法で実現すればよいのでしょうか。教えてください。

セレクトボックスの作成について、以下のコードで「デザート」セレクトの選択によって、「好きなもの」のセレクトボックスの選択肢が変化する、というのを実現しました。
しかし、これは第2セレクトボックスの選択肢が同数の場合です。

HTML

1<form name="selbox"> 2 <p>デザート</p> 3 <select name="dessert" onChange="set()"> //第1セレクトボックス 4 <option value="">選択してください</option> 5 <option value="">フルーツ</option> 6 <option value="">ケーキ</option> 7 </select> 8 9 <p>好きなもの</p> 10 <select name="favorite" require> //第2セレクトボックス 11 <option value="">選択してください</option> 12 <option value=""></option> 13 <option value=""></option> 14 <option value=""></option> 15 </select> 16 </form>

javascript

1var favorite_fruit =['','オレンジ','りんご','メロン']; 2var favorite_cake =['','ショートケーキ','チョコレートケーキ','チーズケーキ']; 3 4function set() { 5 6 for(i=1; i<4; i++) { 7 8 switch(document.selbox.dessert.selectedIndex) { 9 case 0: 10 document.selbox.favorite.options[i].text=''; 11 break; 12 case 1: 13 document.selbox.favorite.options[i].text=favorite_fruit [i]; 14 break; 15 case 2: 16 document.selbox.favorite.options[i].text=favorite_cake [i]; 17 break; 18 } 19 } 20 document.selbox.favorite.selectedIndex()=0; 21}

もし、例えばケーキを選択した場合の第2セレクトボックスの選択肢が以下だった場合

JavaScript

1var favorite_cake =['','ショートケーキ','チョコレートケーキ','チーズケーキ','ティラミス'];

どのようにすれば、第2セレクトボックスに選択肢を4つ入れられるのでしょうか。

for文の「i < 4」にif分を入れて場合分けしたりしましたが、うまくいきませんでした。

ご回答願います。

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

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

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

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

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

m.ts10806

2019/08/21 15:28

<option>は必ず空で置いていないといけない前提でしょうか。
退会済みユーザー

退会済みユーザー

2019/08/21 20:01

空でなくても大丈夫です!!
guest

回答2

0

select 要素を再生成し、.replaceChild() で置き換えます。

JavaScript

1var favorites = [ 2 [], 3 [['オレンジ', ''], ['りんご', ''], ['メロン', '']], 4 [['ショートケーキ', ''], ['チョコレートケーキ', ''], ['チーズケーキ', ''], ['ティラミス', '']] 5]; 6 7function set() { 8 var form = document.forms['selbox']; 9 var favorite = favorites[form.elements['dessert'].selectedIndex]; 10 var original = form.elements['favorite']; 11 var select = original.cloneNode(false); 12 select.add(original.options[0].cloneNode(true)); 13 for (var i = 0; i < favorite.length; i++) { 14 select.add(new Option(favorite[i][0], favorite[i][1])); 15 } 16 17 select.selectedIndex = select.length > original.selectedIndex ? original.selectedIndex : 0; 18 original.parentNode.replaceChild(select, original); 19}

https://developer.mozilla.org/ja/docs/Web/API/Node/replaceChild

投稿2019/08/22 03:18

x_x

総合スコア13749

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

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

退会済みユーザー

退会済みユーザー

2019/08/22 14:12

実現できました! .replaceChild() で置き換えるんですね。 大変勉強になりました、ありがとうございます。 お二方に回答いただき、私にとってはどちらもベストアンサーでしたが、先に回答いただいた方をベストアンサーとさせていただきました。ご容赦ください。
guest

0

ベストアンサー

「選択したものから更に選択したい」となると単なる変数で持つよりオブジェクトで持ったほうが良いと思います。
で、それぞれの配列を紐づけられるようなoptionのvalueを指定して、
リストを作る(あと毎回初期化する)

html

1<!-- thisを引数に追加 --> 2<!-- valueを追加 --> 3 <select name="dessert" onChange="set(this)"> 4 <option value="">選択してください</option> 5 <option value="fruit">フルーツ</option> 6 <option value="cake">ケーキ</option> 7 </select> 8 9<!-- 空にする --> 10 <select name="favorite" require></select>

js

1let favorite = {}; 2favorite.fruit =['','オレンジ','りんご','メロン']; 3favorite.cake = ['','ショートケーキ','チョコレートケーキ','チーズケーキ']; 4 5function set(elem) { 6 //favoriteを初期化 7 let fav = document.querySelector("select[name='favorite']"); 8 let favop = fav.options; 9 let favoplen = fav.options.length; 10 for (let i = favoplen-1; i >= 0; i--) { 11 fav.removeChild( favop.item( i ) ); 12 } 13 //未選択時はなし 14 if(elem.value == ""){ 15 return; 16 } 17 if(elem.value in favorite){ 18 //リストを作成 19 for (let i = 0; i < favorite[elem.value].length; i++) { 20 let op = document.createElement('option'); 21 if(i==0){ 22 op.value = ''; 23 op.textContent = '選択してください'; 24 }else{ 25 op.value = i; 26 op.textContent = favorite[elem.value][i]; 27 } 28 fav.appendChild(op); 29 } 30 } 31}

投稿2019/08/22 02:08

m.ts10806

総合スコア80850

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

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

m.ts10806

2019/08/22 02:18

できればfavoriteのvalueもdessertのvalueみたいな持ち方したほうがいいかなとは思いました。 この2つのselectをこの後どうしたいかで決めてください。
退会済みユーザー

退会済みユーザー

2019/08/22 13:48

実現できました! ありがとうございます。 重ねて質問で申し訳ないのですが、 for (let i = favoplen-1; i >= 0; i--) { fav.removeChild( favop.item( i ) ); } の部分で何をしているのかが、よく理解できません。 ご教授願います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問