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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

解決済

2回答

5760閲覧

動的に追加したフォームの内容をサーバーで受け取りたい

baron3

総合スコア16

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2018/10/19 05:12

編集2018/10/22 01:50

前提・実現したいこと

・動的に追加、削除できるフォームを作りたい
・新たに追加されたフォームのValue値をサーバー側で受け取りたい

フォームはドロップダウンでカテゴリを選び、テキストで文字列を入力できるタイプのものです。
参考画像

該当のソースコード

html

1<div class="md-form input-group"> 2 <div id="form-block" class="md-form input-group"> 3 <div class="dropdown input-group-prepend"> 4 <button class="btn btn-primary m-0 dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" value="">Dropdown</button> 5 <ul class="dropdown-menu"> 6 <li><a href="#" class="dropdown-item" value="aaa">aaa</a></li> 7 <li><a href="#" class="dropdown-item" value="bbb">bbb</a></li> 8 <li><a href="#" class="dropdown-item" value="ccc">ccc</a></li> 9 <li><a href="#" class="dropdown-item" value="ddd">ddd</a></li> 10 </ul > 11 <input type="hidden" class="form-control" id="dropdown-value" name="dropdown-value" aria-label="" value=""> 12 </div> 13 <input type="text" class="form-control" aria-label="Text input with dropdown button"> 14 </div> 15</div> 16<div class="mx-auto text-center"> 17 <button type="button" value="" class="btn btn-sm btn-default add"></button> 18 <button type="button" value="" class="btn btn-sm btn-default del" disabled></button> 19</div> 20

JS

1$(function(){ 2 $('.dropdown-menu .dropdown-item').click(function(){ 3 // ドロップダウン項目の表示を変更 4 var visibleItem = $('.dropdown-toggle', $(this).closest('.dropdown')); 5 var dropdown_value = $(this).attr('value'); 6 visibleItem.text(dropdown_value); 7 // input[type=hidden]にドロップダウン項目を入れる 8 var hidden_form = $(this).closest('.dropdown-menu').next(); 9 hidden_form.val(dropdown_value); 10 }); 11 12 // +ボタン(class="add")がクリックされたら 13 $(document).on("click", ".add", function () { 14   //今あるフォームの数を取得 15 var count = $('div[id^=form-block]').length; 16 var originalForm = $('#form-block'); 17 18 // formが4つになったら.addをdisabled 19 if(count===4){ 20 $('.add').prop("disabled", true); 21 }else{ 22 //.delを押せるように変更 23 $('.del').prop("disabled", false); 24 } 25 26 originalForm 27 .clone(true) 28 .insertAfter(originalForm) 29 .attr('id', 'form-block[' + count + ']'); 30 }); 31 32 // -ボタン(class="del")がクリックされたら 33 $(document).on("click", ".del", function () { 34 var count = $('div[id^=form-block]').length; 35 36 // formが1つになったら.dellをdisabled 37 if(count===1){ 38 $('.del').prop("disabled", true); 39 } 40 var originalForm = $('form-block[' + count + ']'); 41 originalForm.remove(); 42 }); 43});

試したこと・問題

オリジナルのフォームformAをコピーして追加することはできました。
しかし新たに追加したフォーム(formB)のドロップダウン項目を変更するとformAのドロップダウン項目が変更されます。
また、追加したフォームを削除することができません。

初めて質問させて頂きます。わかりにくいところなどご指摘いただけますと幸いです。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Laravel5.5
Bootstrap4.1.3
jquery3.3.1

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

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

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

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

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

guest

回答2

0

比較が間違ってます。=では代入になってしまいます(この場合常に真)。-ボタンも同様。

JavaScript

1//if(count=4){ 2if (count === 4) {

削除時の要素取得の記述ミスを追加。

jQuery

1$('#form-block\[' + (count - 1).toString() + '\]');

投稿2018/10/22 01:27

編集2018/10/22 01:57
x_x

総合スコア13749

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

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

baron3

2018/10/22 01:45 編集

ご回答ありがとうございます!これは凡ミスです。 当初(>=)としていたのを修正した際に忘れていたのだと思います。 (===)にしても依然問題は解決しません。 質問内容は修正します!
x_x

2018/10/22 01:59

削除時の要素取得について追記しました。 「formBのドロップダウン項目を変更するとformAのドロップダウン項目が変更され」るのは再現できていないので不明です。
colling

2018/10/22 08:12

最後の方の、 var originalForm = $('form-block[' + count + ']'); の後に、console.log(originalForm); として確認をしてみてください。 x_xさんの書いているように(count - 1)としなければ、最後に追加したIDが指定できていませんよー。
guest

0

自己解決

解決しました。全ソースは最後に書きます。
回答くださった先輩方、ありがとうございました。大変参考になりました。
Bootstrap4のButtons with dropdownsを使って同じようなことをしたい方がいらっしゃるかもしれないのでまとめておきます。同志よ共に頑張りましょう!
また、もっとこうした方がいい等アドバイスがございましたら頂けますと幸いです。

結論から言うと、

js

1 〇 originalForm.clone() 2 ✕ originalForm.clone(true)

クローンしたフォームにtrueが入っていたことが大きな原因でした。
trueを入れると設定したイベントもクローンしてしまう為、「formBのドロップダウン項目を変更するとformAのドロップダウン項目が変更」されていたようです。正確にはformBのドロップダウンボタンを押すとformAのドロップダウンが開いていました。フォームが重なってたので気づかなかった。。

今回実装する必要があったのは主に4つでした。
1.ドロップダウンの項目を変更する(Bootstrap4のソースをコピペしても項目が変更できない)
2.フォームを増やす
3.フォームを減らす
4.サーバーでフォームの内容を受け取ることができるように紐づけを行う

最後の4つ目は、フォームをコピーしただけだとname属性が被るので思った通りになりません。

html

1<input type="hidden" class="form-control" id="id_type" name="id_type" aria-label="" value="">

実装のポイントは次の3つと考えました。
1.追加したフォームにもイベントを適用
2.追加したフォームを特定できようにIDを動的に変化
3.追加したフォームのname属性を動的に変化

1つ目はドロップダウン項目の選択にイベントを使っているため、コピーしたフォームでも同じイベントを使えるようにする必要があります。なので、".on"を使う必要がありました。これを使うことで後から動的に追加された要素にもイベントを適用することができます

2と3は追加ボタンが押された時にIDなどを書き換えました。
今回は”.length”を使ってform-blockで始まる要素がいくつあるか取得して、その数字に+1したものをIDやname属性に入れています。フォームを追加していくとこの様なHTMLが出来上がります。

html

1id=form-block[1] 2 input[type=hidden] name=form_type[1] 3id=form-block[2] 4 input[type=hidden] name=form_type[2] 5id=form-block[3] 6 input[type=hidden] name=form_type[3] 7コード

全ソース

HTML

1<div class="md-form input-group"> 2 <div id="form-block[1]" class="md-form input-group"> 3 <div id="btn" class="dropdown input-group-prepend"> 4 <button id="btn-id" class="btn btn-primary m-0 dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" value="">ID</button> 5 <ul class="dropdown-menu"> 6 <li><a href="#" class="dropdown-item" value="aaa">aaa</a></li> 7 <li><a href="#" class="dropdown-item" value="bbb">bbb</a></li> 8 <li><a href="#" class="dropdown-item" value="ccc">ccc</a></li> 9 </ul > 10 <input type="hidden" class="form-control" id="form_type" name="form_type[1]" aria-label="" value=""> 11 </div> 12 13 <input type="text" class="form-control"id="input_form" name="input_form[1] aria-label="Text input with dropdown button"> 14 </div> 15</div>

js

1$(function(){ 2 "use strict"; 3 var select = function(e){ 4 //form-blockを特定 5 var dropdown_view = $(this).closest('.dropdown').parent(); 6 var dropdown_value = $(this).attr('value'); 7 dropdown_view.find('.dropdown-toggle').text(dropdown_value); 8 // input[type=hidden]にドロップダウン項目を入れる 9 var id_type = $(this).closest('.dropdown-menu').next(); 10 id_type.val(dropdown_value); 11 } 12 13 var addbtn = function(e){ 14 var count = $('div[id^=form-block]').length; 15 var originalForm = $('#form-block\[' + count +'\]'); 16 17 //formが合計4つ(3つ増えたら)になったら.addをdisabled 18 if(count===3){ 19 $('.add').prop("disabled", true); 20 } 21 22 //.delを押せるように変更 23 $('.del').prop("disabled", false); 24 25 //フォームをコピー 26 var copiedForm = originalForm 27 .clone() 28 .insertAfter(originalForm) 29 .attr('id', 'form-block[' + (count + 1) + ']'); 30 31 32 copiedForm 33 .find('#form_type') 34 .attr('name', 'form_type[' + (count + 1) + ']') 35 .val(''); 36     //コピーしたフォームの値を初期化 37 copiedForm 38 .find('.dropdown-toggle') 39 .text('id'); 40 copiedForm 41 .find('#input_form') 42 .attr('name', 'input_form[' + (count + 1) + ']') 43 .text(''); 44 45 } 46 47 var delbtn = function(e){ 48 var count = $('div[id^=form-block]').length; 49 // formが残り1つになったら 50 if(count===2){ 51 $('.del').prop("disabled", true); 52 $('.add').prop("disabled", false); 53 } 54 var originalForm = $('#form-block\[' + count + '\]'); 55 originalForm.remove(); 56 } 57 58 $(document).on("click", ".dropdown-menu .dropdown-item", select); 59 $(document).on("click", ".add", addbtn); 60 $(document).on("click", ".del", delbtn); 61 62});

投稿2018/10/23 03:22

編集2018/10/23 03:52
baron3

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問