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

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

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

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

jQuery

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1081閲覧

jQueryでフォームを動的に追加

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/11/12 07:10

編集2019/11/14 03:49

添付画像のようなフォームを作っています。
設問グループ、設問をそれぞれ追加できるようにしたいです。
下記のコードで一応追加できるのですが、グループを追加した後に設問を追加することができません。

要素数の取得が上手くいっていないです。
(クローン元の要素数、下記のコードで言うと // 設問グループを追加の classLength)
どなたかご教示いただけると幸いです。

html

1<div class="area_question_group_360" id="group1"> 2 <p class="ttl">設問グループタイトル</p> 3 <div class="wrap_input wrap_required group_ttl"> 4 <input placeholder="設問グループタイトルを記述" name="wholeAngleSurveyGroup.title[]" type="text"> 5 <div class="unit_2_center btn_delete_group" data-tabno="1">削除</div> 6 </div> 7 <div class="wrap_input" id="question1"> 8 <span class="unit_2 number">Q. </span> 9 <div class="wrap_input wrap_required"> 10 <input placeholder="回答選択肢を記述" name="wholeAngleSurveyQuestion.title[0][]" type="text"> 11 </div> 12 <div class="unit_2_center button_text_delete_360">削除</div> 13 </div> 14 <div class="area_add_question_360"> 15 <div class="btnarea_left"> 16 <div class="button_text_add_question_360" id="add_question">設問を追加する</div> 17 </div> 18 <div class="note">※選択肢は上限20項目です。</div> 19 </div> 20</div> 21<div class="btnarea_left_add_group"> 22 <div class="btn_goast_purple_add_group" id="add_group">設問グループを追加する</div> 23</div> 24 25// 設問グループを追加 26<script> 27 $(document).on('click', '#add_group', function() { 28 //要素の数をカウントして、複製したフォームのnameを変更する 29 classLength = $('[id^=group]').length; // 要素数 1, 2 30 selector = "#group"+(classLength); // 1つ前のID名 #group1, 2 31 newSelector = "group"+(classLength + 1); // 新しいID group2,3 32 // クローン処理 33 $("#group1").clone(true).insertAfter(selector).attr('id', newSelector); 34 // 複製したものに関する調整処理 35 $("#" + newSelector).find("input").each(function(i, elm){ 36 elm.name = elm.name.replace(/[[0-9]+]/, '[' + classLength + ']'); 37 elm.id = elm.id.replace(/\-[0-9]+\-/, '-' + classLength + '-'); 38 elm.value = null; 39 }); 40 }); 41</script> 42 43// 設問を追加 44<script> 45 $(document).on('click', '#add_question', function() { 46 // 要素の数をカウントして、複製したフォームのnameを変更する 47 classLength = $('[id^=question]').length; // 要素数 1, 2 48 selector = "#question"+(classLength); // 1つ前のID名 #question1, 2 49 newSelector = "question"+(classLength + 1); // 新しいID question2,3 50 // クローン処理 51 $("#question1").clone(true).insertAfter(selector).attr('id', newSelector); 52 // 複製したものに関する調整処理 53 $("#" + newSelector).find("input").each(function(i, elm){ 54 elm.value = null; 55 }); 56 }); 57</script>

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

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

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

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

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

mikkame

2019/11/12 08:25

前回の質問もそうでしたがjQueryでできなくはないものの jQueryでやると複雑度が上がるので VueかReactの方がこのような用途に向いているかと思います
guest

回答1

0

ベストアンサー

コピーされる対象である要素の中にidが指定してあっては、複数のボタンに同一のidがふられてしまうのでだめなのでは?という気がしたので、以下のようにクラスに変更してみたところ、動きました。

原因がそこなのかは定かではありませんが・・・

html

1 <div class="area_question_group_360" id="group1"> 2 <p class="ttl">設問グループタイトル</p> 3 <div class="wrap_input wrap_required group_ttl"> 4 <input placeholder="設問グループタイトルを記述" name="wholeAngleSurveyGroup.title[]" type="text"> 5 <button class="unit_2_center btn_delete_group" data-tabno="1">削除</button> 6 </div> 7 <div class="wrap_input question"> 8 <span class="unit_2 number">Q. </span> 9 <div class="wrap_input wrap_required"> 10 <input placeholder="回答選択肢を記述" type="text"> 11 </div> 12 <button class="unit_2_center button_text_delete_360">削除</button> 13 </div> 14 <div class="area_add_question_360"> 15 <div class="btnarea_left"> 16 <!--add_questionをidからclassに変更--> 17 <button class="button_text_add_question_360 add_question">設問を追加する</button> 18 </div> 19 <div class="note">※選択肢は上限20項目です。</div> 20 </div> 21 </div> 22 <div class="btnarea_left_add_group"> 23 <button class="btn_goast_purple_add_group" id="add_group">設問グループを追加する</button> 24 </div>

javascript

1// 設問グループを追加 ココは変更してません 2$(document).on('click', '#add_group', function () { 3 //要素の数をカウントして、複製したフォームのnameを変更する 4 classLength = $('[id^=group]').length; // 要素数 1, 2 5 selector = "#group" + (classLength); // 1つ前のID名 #group1, 2 6 newSelector = "group" + (classLength + 1); // 新しいID group2,3 7 // クローン処理 8 $("#group1").clone(true).insertAfter(selector).attr('id', newSelector); 9 // 複製したものに関する調整処理 10 $("#" + newSelector).find("input").each(function (i, elm) { 11 elm.name = elm.name.replace(/[[0-9]+]/, '[' + classLength + ']'); 12 elm.id = elm.id.replace(/\-[0-9]+\-/, '-' + classLength + '-'); 13 elm.value = null; 14 }); 15}); 16 17// 設問を追加 18$(document).on('click', '.add_question', function () { //クラスに対してイベント設定 19 //クリックされた要素の上部のwrap_inputを取得 20 let $wrap_input = $(this).parents(".area_add_question_360").prev(); 21 //その要素をコピーして差し込み 22 $wrap_input.prev().clone(true).insertAfter($wrap_input); 23});

投稿2019/11/12 09:14

satoshi_tajima

総合スコア337

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

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

退会済みユーザー

退会済みユーザー

2019/11/14 01:38

ご教示いただいたコードで動きました、ありがとうございました! classに変えるという発想がありませんでした。 このフォームに関してもう1つ違う質問があるのでご確認していただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問