###前提・実現したいこと
ユーザがフォームで入力したデータを、以下のようにフォーム名とインプット名でネストしたJSONにしてサーバに送信したい。
JSON
1{ 2 "フォーム名1":{ 3 "インプット名1": "入力したデータ1", 4 "インプット名1": "入力したデータ2" 5 }, 6 "フォーム名2":{ 7 "インプット名1": "入力したデータ1", 8 "インプット名1": "入力したデータ2" 9 } 10}
フォームは複数あり、それぞれでまとめたいと思っています。
###該当のソースコード
AdminLTE(Bootstrapベースの管理コンソール)を使用しているため、それに関連するタグも付いています。また、二つ目のフォームも省略しています。
HTML
1<div class="box box-primary"> 2 <div class="box-header with-border"> 3 <h3 class="box-title">タイトル</h3> 4 </div> 5 <form role="form" method="post" name="フォーム名1"> 6 <div class="box-body"> 7 <div class="form-group"> 8 <label class="control-label">インプット1のタイトル</label> 9 <input type="text" name="インプット名1" class="form-control"/> 10 </div> 11 <div class="form-group"> 12 <label class="control-label">インプット2のタイトル</label> 13 <input type="text" name="インプット名2" class="form-control"/> 14 </div> 15 </div> 16 <div class="box-footer"> 17 <button type="submit" class="btn btn-primary">送信</button> 18 </div> 19 </form> 20</div> 21ここまでがフォーム数だけ繰り返し
JavaScript
1$('form').submit(function(event) { 2 // HTMLでの送信をキャンセル 3 event.preventDefault(); 4 // 操作対象のフォーム要素を取得 5 var $form = $(this); 6 // フォームのデータをDisableにする前に取得 7 var tmpData = $form.serializeArray(); 8 // フォーム無効化 9 $form.disable(); 10 11 // 送信 12 $.ajax({ 13 url: $form.attr('action'), 14 type: $form.attr('method'), 15 data: tmpData, 16 timeout: 5000, 17 18 }).done(function(result, textStatus, xhr){ 19 alert('OK'); 20 }).fail(function(xhr, textStatus, error){ 21 alert('NG...'); 22 }).always(function(xhr, textStatus){ 23 $form.enable(); 24 }); 25});
###補足情報
フォームが複数あり、出来れば、共通のsubmitを使用したいと考えていますが、Web開発は初めてですので、この考え方自体がおかしかったら教えてください。
よろしくお願いいたします。
##追記 解決方法
以下コードで実現は出来ましたが、最適解ではないかもしれません。(後述)
JavaScript
1$('form').submit(function(event) { 2 // HTMLでの送信をキャンセル 3 event.preventDefault(); 4 // 操作対象のフォーム要素を取得 5 var $form = $(this); 6 // フォームのデータをDisableにする前に取得 7 var className = $form["0"].className; // <---修正部分 8 var tmpData = $form.serializeArray(); 9 10 // フォーム無効化 11 $form.disable(); 12 13 // 修正部分 14 var jsonStrBase = '{"' + className + '":{"'; 15 for(var i in tmpData ){ 16 jsonStrBase = jsonStrBase + tmpData[i].name + '": "' + tmpData[i].value +'","' 17 } 18 var jsonStr = jsonStrBase.slice(0, -2) + '}}' 19 20 // 送信 21 $.ajax({ 22 url: $form.attr('action'), 23 type: $form.attr('method'), 24 data: jsonStr, 25 contentType: 'application/json', 26 timeout: 5000, // 単位はミリ秒 27 28 }).done(function(result, textStatus, xhr){ 29 alert('OK'); 30 }).fail(function(xhr, textStatus, error){ 31 alert('NG...'); 32 }).always(function(xhr, textStatus){ 33 $form.enable(); 34 }); 35});
タイトルと異なってしまいますが、元々やりたかったことは、「グループ分けした情報をネストしたJSONで送りたい」となります。
ここに載せたコードでは、formを設置し、formから取得した値をjQueryのajaxで送信していますが、フォームを設置せず、「複数の input をグループ分けして、 $('#hoge').click(function(){ でグループのidなどでから内容を取得し、JSONを組み立てて送信する。」という方法の方がシンプルかもしれません。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/16 02:57 編集