前提・実現したいこと
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/
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/21 01:59