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

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

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

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

HTML

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

Q&A

解決済

2回答

383閲覧

動的Webフォームの非表示領域のdisabled化について

babysonfire

総合スコア5

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2019/08/20 11:45

前提・実現したいこと

Selectした内容によって動的に入力項目が変わるWebフォームを作ろうとしています。
最初にSelectした項目に合わせてそれ以降のフォームを変更したいと考えていますが、一部は共通項目であり、
最初に選んだ項目によって必須か必須でないかが異なります。

質問の内容

JavaScriptでgetElementsByClassNameとgetElementByIdを組み合わせ、無関係の項目をdisplay = none;で非表示にしました。

ここまでは意図通りだったのですが、INPUT項目にRequiredを付与したところ、
非表示になっている項目が未入力と判定されてsubmit出来なくなりました。

恐らく非表示になっている領域がdisabledになっていないのが原因だと考えていますが、
上手くdisabledに出来ません。ここを上手く解決する方法は無いでしょうか。

発生している問題・エラーメッセージ

- submitボタンを押してもPOSTされない - submitボタン押下後、別の項目を選択すると入力エリアが赤くなっている(可視エリアで入力せず「このフィールドは入力必須です」が出た後も赤くなります)

該当のソースコード

html

1 2 <form name="form1" action="#" method="post"> 3 <div class="pulldownset products"> 4 <select class="mainselect" name="products_name"> 5 <option value="">Select</option> 6 <option value="Products_A">製品A</option> 7 <option value="Products_B">製品B</option> 8 <option value="Products_C">製品C</option> 9 </select><br> 10 11 <p id="Products_A" class="subbox"> 12 Start date <input type="date" name="StartDate" required> : <span style="color:#FF5555"><span style="color:#FF5555">必須</span></span><br> 13 Expire date <input type="date" name="ExpireDate" required> : <span style="color:#FF5555">必須</span><br> 14 </p> 15 16 <p id="Products_B" class="subbox"> 17 Start date <input type="date" name="StartDate"><br> 18 Expire date <input type="date" name="ExpireDate" required> : <span style="color:#FF5555">必須</span><br> 19 </p> 20 21 <p id="Products_C" class="subbox"> 22 Start date <input type="date" name="StartDate"><br> 23 Expire date <input type="date" name="ExpireDate"><br> 24 </p> 25 26 <input type="submit" value="go" method="post"> 27 28 </div> 29 </form> 30 31 32 33 <script type="text/javascript"> 34 document.addEventListener('DOMContentLoaded', function() { 35 var allSubBoxes = document.getElementsByClassName("subbox"); 36 for( var i=0 ; i<allSubBoxes.length ; i++) { 37 allSubBoxes[i].style.display = 'none'; 38 allSubBoxes[i].disabled = true; //a 39 } 40 41 var mainBoxes = document.getElementsByClassName('pulldownset'); 42 for( var i=0 ; i<mainBoxes.length ; i++) { 43 44 var mainSelect = mainBoxes[i].getElementsByClassName("mainselect"); 45 mainSelect[0].onchange = function () { 46 var subBox = this.parentNode.getElementsByClassName("subbox"); 47 for( var j=0 ; j<subBox.length ; j++) { 48 subBox[j].style.display = 'none'; 49 subBox[j].disabled = true; //a 50 } 51 52 if( this.value ) { 53 var targetSub = document.getElementById( this.value ); 54 targetSub.style.display = 'inline'; 55 targetSub.disabled = false; //a 56 } 57 } 58 } 59 }); 60 </script> 61

試したこと

  • それぞれのINPUTにclass="subbox"を指定してみる ->NG
  • 全てのgetElementsByClassNameをgetElementByIdに変えてみる ->Selectとの連携がよくわからなくなり挫折
  • requiredを消して動作するかの確認 -> する

その他

Javascript部分は以下URLを参考にさせて頂きました。
https://allabout.co.jp/gm/gc/23955/

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

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

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

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

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

guest

回答2

0

若干classとidの使い方が微妙ですが、こんな感じでどうでしょうか?

javascript

1<script type="text/javascript"> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 const changeMainSelect=()=>{ 4 var v=document.querySelector(".mainselect").value; 5 [].forEach.call(document.querySelectorAll(".subbox"),x=>{; 6 var flg=x.getAttribute('id')==v; 7 x.style.display = flg?'':'none'; 8 }); 9 [].forEach.call(document.querySelectorAll(".subbox input"),x=>{; 10 var flg=v?x.closest("#"+v):false; 11 x.disabled=!flg; 12 }); 13 } 14 changeMainSelect(); 15 document.querySelector(".mainselect").addEventListener('change',()=>{ 16 changeMainSelect(); 17 }); 18}); 19</script> 20<form name="form1" action="#" method="post"> 21<div class="pulldownset products"> 22<select class="mainselect" name="products_name"> 23<option value="">Select</option> 24<option value="Products_A">製品A</option> 25<option value="Products_B">製品B</option> 26<option value="Products_C">製品C</option> 27</select><br> 28 29<p id="Products_A" class="subbox"> 30Start date <input type="date" name="StartDate" required> : <span style="color:#FF5555"><span style="color:#FF5555">必須</span></span><br> 31Expire date <input type="date" name="ExpireDate" required> : <span style="color:#FF5555">必須</span><br> 32</p> 33 34<p id="Products_B" class="subbox"> 35Start date <input type="date" name="StartDate"><br> 36Expire date <input type="date" name="ExpireDate" required> : <span style="color:#FF5555">必須</span><br> 37</p> 38 39<p id="Products_C" class="subbox"> 40Start date <input type="date" name="StartDate"><br> 41Expire date <input type="date" name="ExpireDate"><br> 42</p> 43 44<input type="submit" value="go" method="post"> 45</div> 46</form>

投稿2019/08/21 01:37

yambejp

総合スコア114843

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

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

babysonfire

2019/08/21 01:59

ご回答ありがとうございました。色々な実現方法があるのですね。 勉強になりました。
guest

0

ベストアンサー

disableをpタグに対して設定しています。
inputタグに対して設定しないと想定通りの動きとなりません。

一旦既存のコードを修正しました。
修正箇所はコメントで記載しています。
今回は行なっていませんが似たような処理がいくつも存在しているので関数にまとめた方がコードがスッキリします。

javascript

1<script type="text/javascript"> 2 document.addEventListener('DOMContentLoaded', function() { 3 var allSubBoxes = document.getElementsByClassName("subbox"); 4 for( var i=0 ; i<allSubBoxes.length ; i++) { 5 allSubBoxes[i].style.display = 'none'; 6 } 7 // inputタグに対してdisabledを設定 8 var allSubBoxes = document.getElementsByName("StartDate"); 9 for( var i=0 ; i<allSubBoxes.length ; i++) { 10 allSubBoxes[i].disabled = true; 11 } 12 var allSubBoxes = document.getElementsByName("ExpireDate"); 13 for( var i=0 ; i<allSubBoxes.length ; i++) { 14 allSubBoxes[i].disabled = true; 15 } 16 17 var mainBoxes = document.getElementsByClassName('pulldownset'); 18 for( var i=0 ; i<mainBoxes.length ; i++) { 19 20 var mainSelect = mainBoxes[i].getElementsByClassName("mainselect"); 21 mainSelect[0].onchange = function () { 22 var subBox = this.parentNode.getElementsByClassName("subbox"); 23 for( var j=0 ; j<subBox.length ; j++) { 24 subBox[j].style.display = 'none'; 25 } 26 // inputタグに対してdisabledを設定 27 var subBox = this.parentNode.getElementsByClassName("StartDate"); 28 for( var j=0 ; j<subBox.length ; j++) { 29 subBox[j].disabled = true; 30 } 31 var subBox = this.parentNode.getElementsByClassName("ExpireDate"); 32 for( var j=0 ; j<subBox.length ; j++) { 33 subBox[j].disabled = true; 34 } 35 36 if( this.value ) { 37 var targetSub = document.getElementById( this.value ); 38 targetSub.style.display = 'inline'; 39 // inputタグに対してdisabledを設定 40 var inputTags = targetSub.getElementsByTagName("input"); 41 for( var j=0 ; j<inputTags.length; j++) { 42 inputTags[j].disabled = false; 43 } 44 } 45 } 46 } 47 }); 48 </script>

投稿2019/08/20 14:52

terotero

総合スコア72

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

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

babysonfire

2019/08/21 01:57

何故pなんだろうと思ったら、私のgetElementsByClassNameの理解が足りていなかったみたいです。 その辺のご指摘含め誠にありがとうございます。 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問