前提・実現したいこと
A,B,C3つのプルダウンメニューをグループにして、1ページに2グループ繰り返します。
A,B,Cはすでに選択肢が決まっていて、Aで選択したものに対してB,Cで選択できる要素が絞り込まれます。
AのプルダウンメニューにAddEventListnerをつけてAをselectedで判定し、B,Cで使えないoptionにdisabledを付け、2回for文で繰り返そうとしています。ところが、addEventListner内でAのselectedが1の場合、2の場合、とif文を書くと、最初の文だけしか効かず、2つ目以降のelse ifが反応してくれません。1つ目を選択した後は、B,Cが固定されてしまいます。2つ目を選択してもB,Cは1つ目の条件になってしまいます。
該当のソースコード
javascript
1const selItem = document.querySelectorAll("select"); 2for (let i = 1; i < 6; i += 3) { 3 selItem[i].setAttribute("disabled", true); 4} 5for (let j = 2; j < 6; j += 3) { 6 selItem[j].setAttribute("disabled", true); 7} 8 9for (let k = 0; k < 6; k += 3) { 10 selItem[k].addEventListener("click", function(evt) { 11 //同じグループのAが選択されたらB,Cのdisabledを外す 12 selItem[k + 1].disabled = false; 13 selItem[k + 2].disabled = false; 14 //Aが変更された場合はB,Cの選択可能オプションが変わるのでB,Cは選択を初期化する 15 selItem[k + 1].selectedIndex = 0; 16 selItem[k + 2].selectedIndex = 0; 17 //Aのoption1つ目 18 if (selItem[k].value == "1") { 19 //Bの制限。Aのvalueが1の場合Bは1,2番目のみ選択可能 20 selItem[k + 1].options[3].setAttribute("disabled", true); 21 selItem[k + 1].options[4].setAttribute("disabled", true); 22 //Cの制限。Aのvalueが1の場合Cは1から6番目のみ選択可能 23 for (let c = 7; c < 12; c++) { 24 selItem[k + 2].options[c].setAttribute("disabled", true); 25 } 26 } 27 28 //Aのoption2つ目 29 else if (selItem[k].value == "2") { 30 //Bの制限。Aのvalueが2の場合Bは1,2,3番目のみ選択可能 31 selItem[k + 1].options[4].setAttribute("disabled",true); 32 //Cの制限。Aのvalueが2の場合Cは4から11番目のみ選択可能 33 for (let c = 1; c < 12; c++) { 34 selItem[k + 2].options[c].setAttribute("disabled", true); 35 } 36 evt.stopPropagation(); // イベントの伝播を止める 37 } 38 }); 39}
HTML
1//A-1 2<select> 3 <option value="" selected="selected">選択 ...</option> 4 <option value="1">11日</option> 5 <option value="2">12日</option> 6</select> 7//B-1 8<select> 9 <option value="" selected="selected">選択 ...</option> 10 <option value="1">田中</option> 11 <option value="2">佐藤</option> 12 <option value="3">藤井</option> 13 <option value="4">伊藤</option> 14</select> 15//C-1 16<select> 17 <option value="" selected="selected">選択 ...</option> 18 <option value="1">9時</option> 19 <option value="2">10時</option> 20 <option value="3">11時</option> 21 <option value="4">12時</option> 22 <option value="5">13時</option> 23 <option value="6">14時</option> 24 <option value="7">15時</option> 25 <option value="8">16時</option> 26 <option value="9">9時〜12時の間</option> 27 <option value="10">13時〜15時の間</option> 28 <option value="11">13時〜15時の間</option> 29</select> 30//A-2 31<select> 32 <option value="" selected="selected">選択 ...</option> 33 <option value="1">理系</option> 34 <option value="2">文系</option> 35</select> 36//B-2 37<select> 38 <option value="" selected="selected">選択 ...</option> 39 <option value="1">田中</option> 40 <option value="2">佐藤</option> 41 <option value="3">藤井</option> 42 <option value="4">伊藤</option> 43</select> 44//C-2 45<select> 46 <option value="" selected="selected">選択 ...</option> 47 <option value="1">9時</option> 48 <option value="2">10時</option> 49 <option value="3">11時</option> 50 <option value="4">12時</option> 51 <option value="5">13時</option> 52 <option value="6">14時</option> 53 <option value="7">15時</option> 54 <option value="8">16時</option> 55 <option value="9">9時〜12時の間</option> 56 <option value="10">13時〜15時の間</option> 57 <option value="11">13時〜15時の間</option> 58</select>
試したこと
独学者で行き詰まってしまいました。ご教示いただけると幸いです。よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー