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

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

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

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

Q&A

解決済

1回答

416閲覧

removeEventListenerを設定したいです

TakuTakahashi

総合スコア10

JavaScript

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

0グッド

0クリップ

投稿2021/07/25 08:44

編集2021/07/25 11:47

プルダウンメニュー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})

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

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

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

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

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

m.ts10806

2021/07/25 08:52

念のため、jsfiddleのプロジェクトURLを提示してもらえませんか? トップページを提示されてもすぐ再現できるわけではありませんので。 それに場合によってはそこからforkして調整したりしたいですし。
TakuTakahashi

2021/07/25 11:09

早速ありがとうございます。以下で良いでしょうか。JSFiddleは整形に2,3回使っていたくらいで機能について分かっておらず頓珍漢なことをしてるかもしれません。よろしくお願いいたします。 https://jsfiddle.net/vmgt8fLj/
guest

回答1

0

ベストアンサー

おそらく
selItem[0].addEventListener("change", function(evt) {
部分はchangeのたびに実行(evt4関数が毎回定義)されるので、addEventListenerとremoveEventListenerで指定したevt4が一致していないのだと思います。

そのためconst selA, selB, selCとfunction evt4()を
上の階層で定義する形に修正しました。

js

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 = ""; 9 10const selA = selItem[0]; 11const selB = selItem[1]; 12const selC = selItem[2]; 13 14function evt4() { 15 selC.disabled = false; 16 selC.selectedIndex = 0; 17 if (selB.value == "2") { //10日 18 for (let item of selC.options) item.removeAttribute("disabled"); 19 selC.options[1].setAttribute("disabled", true); 20 selC.options[4].setAttribute("disabled", true); 21 for (let c = 7; c < 12; c++) { 22 selC.options[c].setAttribute("disabled", true); 23 } 24 } else if (selB.value == "3") { //15日 25 for (let item of selC.options) item.removeAttribute("disabled"); 26 selC.selectedIndex = 0; 27 selC.options[1].setAttribute("disabled", true); 28 for (let c = 4; c < 12; c++) { 29 selC.options[c].setAttribute("disabled", true); 30 } 31 } 32} 33 34selItem[0].addEventListener("change", function(evt) { 35 36 //同じグループのAが選択されたらB,Cのdisabledを外す 37 selB.disabled = false; 38 selC.disabled = false; 39 //他で制限された状態を解放する 40 for (let item of selB.options) item.removeAttribute("disabled"); 41 for (let item of selC.options) item.removeAttribute("disabled"); 42 //Aが変更された場合はB,Cの選択可能オプションが変わるのでB,Cは選択を初期化する 43 selB.selectedIndex = 0; 44 selC.selectedIndex = 0; 45 46 47 48 //selBのイベントリスナが残っていれば削除 49 if (Battached == "1") { 50 console.log('off'); 51 selB.removeEventListener("change", evt4, false); 52 Battached = ""; 53 } 54 55 //Aのoption1月のとき 56 if (selA.value == "1") { 57 //Bの制限。Aのvalueが1の場合Bはvalue1,2のみ選択可能 58 selB.options[3].setAttribute("disabled", true); 59 selB.options[4].setAttribute("disabled", true); 60 //Cの制限。Aのvalueが1の場合Cは4のみ選択可能 61 for (let item of selC.options) item.removeAttribute("disabled"); 62 for (let c = 1; c < 4; c++) { 63 selC.options[c].setAttribute("disabled", true); 64 } 65 for (c = 5; c < 12; c++) { 66 selC.options[c].setAttribute("disabled", true); 67 } 68 } 69 70 //Aのoption4月のときBはどれでもOK,Cはvalue4のみ 71 else if (selA.value == "2") { 72 for (let b = 1; b < 4; b++) { 73 selB.options[b].setAttribute("disabled", true); 74 } 75 for (let c = 1; c < 4; c++) { 76 selC.options[c].setAttribute("disabled", true); 77 } 78 for (c = 5; c < 12; c++) { 79 selC.options[c].setAttribute("disabled", true); 80 } 81 } 82 83 //Aのoption7月のときBはどれでもOK,Cは8と11が選択可能 84 else if (selA.value == "3") { 85 for (let c = 1; c < 8; c++) { 86 selC.options[c].setAttribute("disabled", true); 87 } 88 selC.options[9].setAttribute("disabled", true); 89 selC.options[10].setAttribute("disabled", true); 90 } 91 92 //Aのoption10月 93 else if (selA.value == "4") { 94 selC.disabled = true; 95 //Bの制限。Aのvalueが4の場合Bはvalue2,3のみOK 96 selB.options[1].setAttribute("disabled", true); 97 selB.options[4].setAttribute("disabled", true); 98 //Cの制限。Aのvalueが4,Bが2の場合Cは2,3,5,6のみ選択可能3の場合は2,3のみ 99 selB.addEventListener("change", evt4, false); 100 Battached = 1; 101 } 102 evt.stopPropagation(); // イベントの伝播を止める 103}) 104

投稿2021/07/27 02:04

webgoto

総合スコア1293

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

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

TakuTakahashi

2021/12/27 04:34

この度は誠にありがとうございます。 確認が遅くなり大変失礼いたしました。動作確認いたしました。 書く位置でこんなに変わるとは・・・自己流の闇雲で完全にはまっていました。 結局この案件は当時もっと条件を緩めましたが、来年は是非活用させていただきます。 最後に改めてお詫びと感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問