プルダウンメニューABC3つ1組で絞り込んでいます。optionは事前に設定されているのでdisabledで特定のoptionを利用不可にします。Aのoption1〜3は選んだ時点でB,Cのoptionが同時に限定され、Aでoption4を選ぶとBにもイベントリスナを追加してCのoptionをさらに絞り込みます。
A-4を選んだ後にAを他のものに変更すると、Bに追加したイベントリスナを削除したいのですができません。JavaScript24行目でそのつもり)
JSFiddleで75行目に「Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.」と表示されますがどうすれば良いかわかりません。お分かりになる方、ご教示いただけると幸いです。何卒よろしくお願いいたします。
希望例としては以下の通りです。
A:1月 B:10日 C:13時
↓
A:10月 B:10日 C:10,11,14,15時(が選択可)
↓
A:1月 B:10日 C:10,11,14,15時(が選択可)←13になって欲しい
html
1A:<select> 2<option>...選択</option> 3<option value="1">1月</option> 4<option value="2">4月</option> 5<option value="3">7月</option> 6<option value="4">10月</option> 7</select> 8B:<select> 9<option>...選択</option> 10<option value="1">1日</option> 11<option value="2">10日</option> 12<option value="3">15日</option> 13<option value="4">30日</option> 14</select> 15C:<select> 16<option>...選択</option> 17<option value="1">9時</option> 18<option value="2">10時</option> 19<option value="3">11時</option> 20<option value="4">13時</option> 21<option value="5">14時</option> 22<option value="6">15時</option> 23<option value="7">16時</option> 24<option value="8">9-10時</option> 25<option value="9">9-12時</option> 26<option value="10">13-15時</option> 27<option value="11">13−16時</option> 28</select>
JavaScript
1//セレクタをselItemに 2const selItem = document.querySelectorAll("select"); 3//BとCは最初は選択不可 4selItem[1].setAttribute("disabled", true); 5selItem[2].setAttribute("disabled", true); 6 7//Bにイベントリスナが追加されているかどうか。追加するときに1にする。 8let Battached = ""; 9selItem[0].addEventListener("change", function(evt) { 10 const selA = selItem[0]; 11 const selB = selItem[1]; 12 const selC = selItem[2]; 13 //同じグループのAが選択されたらB,Cのdisabledを外す 14 selB.disabled = false; 15 selC.disabled = false; 16 //他で制限された状態を解放する 17 for (let item of selB.options) item.removeAttribute("disabled"); 18 for (let item of selC.options) item.removeAttribute("disabled"); 19 //Aが変更された場合はB,Cの選択可能オプションが変わるのでB,Cは選択を初期化する 20 selB.selectedIndex = 0; 21 selC.selectedIndex = 0; 22 //selBのイベントリスナが残っていれば削除 23 if (Battached == "1") { 24 selB.removeEventListener("change", evt4, false); 25 Battached = ""; 26 } 27 28 //Aのoption1月のとき 29 if (selA.value == "1") { 30 //Bの制限。Aのvalueが1の場合Bはvalue1,2のみ選択可能 31 selB.options[3].setAttribute("disabled", true); 32 selB.options[4].setAttribute("disabled", true); 33 //Cの制限。Aのvalueが1の場合Cは4のみ選択可能 34 for (let item of selC.options) item.removeAttribute("disabled"); 35 for (let c = 1; c < 4; c++) { 36 selC.options[c].setAttribute("disabled", true); 37 } 38 for (c = 5; c < 12; c++) { 39 selC.options[c].setAttribute("disabled", true); 40 } 41 } 42 43 //Aのoption4月のときBはどれでもOK,Cはvalue4のみ 44 else if (selA.value == "2") { 45 for (let b = 1; b < 4; b++) { 46 selB.options[b].setAttribute("disabled", true); 47 } 48 for (let c = 1; c < 4; c++) { 49 selC.options[c].setAttribute("disabled", true); 50 } 51 for (c = 5; c < 12; c++) { 52 selC.options[c].setAttribute("disabled", true); 53 } 54 } 55 56 //Aのoption7月のときBはどれでもOK,Cは8と11が選択可能 57 else if (selA.value == "3") { 58 for (let c = 1; c < 8; c++) { 59 selC.options[c].setAttribute("disabled", true); 60 } 61 selC.options[9].setAttribute("disabled", true); 62 selC.options[10].setAttribute("disabled", true); 63 } 64 65 //Aのoption10月 66 else if (selA.value == "4") { 67 selC.disabled = true; 68 //Bの制限。Aのvalueが4の場合Bはvalue2,3のみOK 69 selB.options[1].setAttribute("disabled", true); 70 selB.options[4].setAttribute("disabled", true); 71 //Cの制限。Aのvalueが4,Bが2の場合Cは2,3,5,6のみ選択可能3の場合は2,3のみ 72 selB.addEventListener("change", evt4, false); 73 Battached = 1; 74 75 function evt4() { 76 selC.disabled = false; 77 selC.selectedIndex = 0; 78 if (selB.value == "2") { //10日 79 for (let item of selC.options) item.removeAttribute("disabled"); 80 selC.options[1].setAttribute("disabled", true); 81 selC.options[4].setAttribute("disabled", true); 82 for (let c = 7; c < 12; c++) { 83 selC.options[c].setAttribute("disabled", true); 84 } 85 } else if (selB.value == "3") { //15日 86 for (let item of selC.options) item.removeAttribute("disabled"); 87 selC.selectedIndex = 0; 88 selC.options[1].setAttribute("disabled", true); 89 for (let c = 4; c < 12; c++) { 90 selC.options[c].setAttribute("disabled", true); 91 } 92 } 93 } 94 } 95 evt.stopPropagation(); // イベントの伝播を止める 96})
回答1件
あなたの回答
tips
プレビュー