下記のjqueryスニペットに機能追加して、増殖フォームを作成しています。
http://code.runnable.com/VZtbYFWhaIY5zFL-/add-remove-form-elements-dynamically-%5Bjquery-javascript%5D
追加機能は、
始めから表示されているフォームブロックを増やし、radio buttonの代わりにtext, checkbox, select要素を追加して、selectのonchangeをトリガーに、その値によって当該フォーム内のtextareaを表示/非表示にする
というものですが、なぜか増殖したフォームだけselectで値を変えてもなにも反応してくれません。
conlose.logでデバッグしたところ、$('select').change() で出力してるものが何も出力されていないので、clone時に問題がありそうですが、あまり詳しくないため勘所もなく手詰まりになっています。
そもそもこのスニペットを使用しての実現は難しいのかどうかなども含めてアドバイス頂けたら幸いです。
よろしくお願いします。
javascript
1$(function () { 2 3 var frm_cnt = 1; 4 5 // [Default表示]プルダウンの値に合わせて選択肢テキストエリアの表示非表示をする 6 for(var i=0; i<=frm_cnt; i++) { 7 var val = $("[id=dish_type\\["+ i +"\\]]").val(); 8 9 if(val == 3 || val == 4 || val == 5) { 10 $('#memos' + i).css('display', 'block'); 11 } 12 else { 13 $('#memos' + i).css('display', 'none'); 14 } 15 } 16 17 // [+]ボタンクリックされた際のアクション 18 $(document).on('click', '.add', function(){ 19 var original = $('#form_block\\[' + frm_cnt + '\\]'); 20 var originCnt = frm_cnt; 21 var originVal = $("input[name='attend\\[" + frm_cnt + "\\]']:checked").val(); 22 23 frm_cnt++; 24 25 $original 26 .clone() 27 .hide() 28 .insertAfter($original) 29 .attr('id', 'form_block[' + frm_cnt + ']') // クローンのid属性を変更。 30 .find("input[type='checkbox'][checked]").prop('checked', true) 31 32 // textareaのdivブロック用追記 33 .attr('id', 'memos' + frm_cnt) 34 35 .end() // 一度適用する 36 .find(':input').each(function(idx, obj) { 37 $(obj).attr({ 38 id: $(obj).attr('id').replace(/\[[0-9]+\]+$/, '[' + frm_cnt + ']'), 39 name: $(obj).attr('name').replace(/\[[0-9]+\]+$/, '[' + frm_cnt + ']') 40 }); 41 42 var $type = obj.type || obj.tagName.toLowerCase(); // form element typeの取得 43 44 //テキストとテキストエリアの中身をクリアにする 45 if ($type == 'text') { 46 $(obj).val(''); 47 } 48 else if($type == 'textarea'){ 49 $(obj).val(''); 50 } 51 }); 52 53 // clone取得 54 var clone = $('#form_block\\[' + frm_cnt + '\\]'); 55 clone.children('span.close').show(); 56 57 clone.slideDown('slow'); 58 59 // originalチェックボックス復元 60 $original.find("input[name='attend\\[" + originCnt + "\\]'][value='" + originVal + "']").prop('checked', true); 61 }); 62 63 $(document).on('click', '.close', function(){ 64 var removeObj = $(this).parent(); 65 removeObj.fadeOut('fast', function() { 66 removeObj.remove(); 67 // 番号振り直し 68 frm_cnt = 0; 69 $(".form-block[id^='form_block']").each(function(index, formObj) { 70 if ($(formObj).attr('id') != 'form_block[0]') { 71 frm_cnt++; 72 $(formObj) 73 .attr('id', 'form_block[' + frm_cnt + ']') // id属性を変更。 74 .find(':input').each(function(idx, obj) { 75 $(obj).attr({ 76 id: $(obj).attr('id').replace(/\[[0-9]+\]+$/, '[' + frm_cnt + ']'), 77 name: $(obj).attr('name').replace(/\[[0-9]+\]+$/, '[' + frm_cnt + ']') 78 }); 79 }); 80 } 81 }); 82 }); 83 }); 84 85 // selectorのvalueによってフォーム内容を変える 86 $('select').change(function() { 87 //idや値を変数に格納 88 var id = $(this).attr('id'); 89 var val = $(this).val(); 90 var num = id.match(/\[([0-9]+)\]+$/)[1]; 91 92 console.log(id + '=' + val); 93 console.log(num); 94 95 //選択したvalue値をp要素に出力 96 if(val == 3 || val == 4 || val == 5) { 97 $('#memos' + num).css('display', 'block'); 98 } 99 else { 100 $('#memos' + num).css('display', 'none'); 101 } 102 }); 103});
HTML
1<form action="/confirm" id="InputForm" method="post" accept-charset="utf-8"> 2 3 <!--0--> 4 <div class="form-block" id="form_block[0]"> 5 <span class="close" title="Close" style="display: none;">-</span> 6 <p class="form-content"> 7 <span><input name="attend_flag[0]" id="attend_flag[0]" value="1" checked="" type="checkbox">参加</span> 8 <span>お名前:<input name="atendee[0]" id="atendee[0]" value="お名前" type="text"></span> 9 <span>ディッシュタイプ: 10 <select name="dish_type[0]" id="dish_type[0]"> 11 <option value="">選択してください</option> 12 <option value="1" selected="">和食</option> 13 <option value="2">フレンチ</option> 14 <option value="3">イタリアン</option> 15 <option value="4">中華</option> 16 <option value="5">その他</option> 17 </select> 18 </span> 19 <span id="memos0" style="display: none;">オプショナルディッシュなど:<br> 20 <textarea name="memo[0]" id="memo[0]" cols="80" rows="3"></textarea> 21 </span> 22 </p> 23 </div> 24 25 <!--1--> 26 <div class="form-block" id="form_block[1]"> 27 <span class="close" title="Close" style="display: block;">-</span> 28 <p class="form-content"> 29 <span><input name="attend_flag[1]" id="attend_flag[1]" value="1" checked="" type="checkbox">参加</span> 30 <span>お名前:<input name="atendee[1]" id="atendee[1]" value="性別" type="text"></span> 31 <span>ディッシュタイプ: 32 <select name="dish_type[1]" id="dish_type[1]"> 33 <option value="">選択してください</option> 34 <option value="1" selected="">和食</option> 35 <option value="2">フレンチ</option> 36 <option value="3">イタリアン</option> 37 <option value="4">中華</option> 38 <option value="5">その他</option> 39 </select> 40 </span> 41 <span id="memos4" style="display: block;">オプショナルディッシュなど:<br> 42 <textarea name="memo[1]" id="memo[1]" cols="80" rows="3"></textarea> 43 </span> 44 </p> 45 </div> 46 <div class="form-block" id="form_add"> 47 <span class="add" title="Add">+</span> 48 </div> 49 <div class="button_confirm"><a href="#" id="Confirm">入力内容の確認</a></div> 50</form>

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/05 01:41