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

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

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

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

4919閲覧

formで送信する情報をネストしたjsonで送りたい

hiroki_s

総合スコア13

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/11/15 02:40

編集2017/11/29 02:16

###前提・実現したいこと
ユーザがフォームで入力したデータを、以下のようにフォーム名とインプット名でネストした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を組み立てて送信する。」という方法の方がシンプルかもしれません。

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

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

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

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

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

guest

回答2

0

複数のフォームをどれを押しても全フォームを走査して全データをおくるというように見えます
もしそうならformを区切らなければいいのではないでしょうか?
また通常のformのactionあてに勝手に整形したデータをおくっても
受け取ってもらえない可能性が高いのであまり良い方法にはみえません
もしやるならajax専用の受け口を作るべきではないでしょうか?
それと送るデータがJSON的な文字列を意識しているのであればその文字列に
パラメータ名をつけないといけません

よくよく仕様を再検討された方がよいでしょう

投稿2017/11/15 03:47

yambejp

総合スコア114769

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

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

hiroki_s

2017/11/16 02:57 編集

回答ありがとうございます。 全フォームの走査は意図通りです。仕様は決まっておらず、出来ることを調査している段階です。 区切らないフォームも含め、検討を行う予定です。 > もしやるならajax専用の受け口を作るべきではないでしょうか? これは、どのような物になるのでしょうか?(submitの他に方法があるのでしょうか?) > パラメータ名をつけないといけません 質問の「解決方法(仮)」に contentType: 'application/json', を追記したのですが、これでいいのでしょうか?
guest

0

ベストアンサー

ボタンクリックで form を submit (POST) したいということであれば、submit する直前に JavaScript で各テキストボックス(input type="text" 要素)から value を取得し、それを JSON 文字列に組み立て、隠しフィールドに入れて送信するという手段はいかがですか?

投稿2017/11/15 02:46

編集2017/11/15 04:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hiroki_s

2017/11/15 03:48

回答ありがとうございます。 nameだけでなく、他の要素を使用すればいいんですね。最悪、nameにフォーム名1とインプット名1を記載して文字列解析も考えてはいたのですが、そちらの方が全然いいですね。 ただ、できれば、inputに毎回同じ内容(フォーム名)を書くのはやめたいとも思っており、せっかくフォーム名があるのだから、そこからとれればいいなと考えていました。 もしくは、複数のinputを何かで囲って定義し、それを取得することができれば…と。
退会済みユーザー

退会済みユーザー

2017/11/16 00:44 編集

> 複数のinputを何かで囲って定義し、それを取得することができれば form である必要はなくて、複数の input をグループ分けして、ボタンクリックで、 { "group1":{"input1": "value1", "input2":"value2" }, "group2":{ ... というような JSON 文字列を組み立てて、jQuery ajax を使ってサーバーの特定 URL に対して POST したいということですか? それも特に問題なく可能だと思います。だだ、それが最適解かどうかは、質問の情報だけでは分かりませんが。
hiroki_s

2017/11/16 03:00 編集

> というような JSON 文字列を組み立てて、jQuery ajax を使ってサーバーの特定 URL に対して POST したいということですか? そうです。そうしているつもりだったのですが、何かおかしなことをしているでしょうか? 当初の質問内容については、グループの名前を $form["0"].className から取得し、フォームからserializeArray()した情報を文字列結合するという方法で実現はできました。(質問文に「解決方法(仮)」として記載しました。) divなども使おうとしたのですが、同じページ内で同じnameやidを使いたかったのでこの方法にしました。
退会済みユーザー

退会済みユーザー

2017/11/16 03:47 編集

> 何かおかしなことをしているでしょうか? jQuery ajax を使って、その data オプションに JSON 文字列を設定し POST するのであれ、input type="submit" ボタンのクリックで form を submit (POST 要求) するというところが「おかしなこと」です。 jQuery ajax を使うなら form を submit するようなことはしない(従い、form 要素も input type="submit" 要素も使わない)、form を submit するなら jQuery ajax は使わない・・・ということなのですが、私の言っていることが分かりますか?
hiroki_s

2017/11/16 09:22

データオプションのjson(dataType:'json',)は、単純に私の間違いでした。(受信にJSONは期待していない) jQuery ajaxでの送信に、 $('#hoge').click(function(){ ではなく、 $('form').submit(function(event) { で行っていますが、この辺りも「おかしなこと」になるでしょうか?
退会済みユーザー

退会済みユーザー

2017/11/16 09:42

> データオプションのjson(dataType:'json',)は、単純に私の間違いでした。(受信にJSONは期待していない) 受信ではなくて送信の話をしているのですが・・・ どうも話が通じてないように思います。質問にアップされていたコードの data: jsonStr の jsonStr は送信したい JSON 文字列ですよね。それで送信するなら form 要素は必要ないと言っているのですが。なので、 $('form').submit... も変では?
hiroki_s

2017/11/17 09:06

いただいた回答を正しく理解できない部分があるので、少し基礎を勉強してきます。また後で質問させていただくと思いますが、その際はお願いいたします。
hiroki_s

2017/11/29 01:38

遅くなりましたが、わかってきたかもしれません。 「複数の input をグループ分けして、 $('#hoge').click(function(){ でグループのidなどでから内容を取得し、JSONを組み立てて送信する。」という事…でいいんですよね。(教えていただいたそのままの事ですね) その場合、form自体を使用する必要はない。 「formは置くが、その要素からは取得する必要はない」だと思ってしまっていました。
退会済みユーザー

退会済みユーザー

2017/11/29 01:46

その理解でいいと思います。「form を submit (POST) する」のと 「jQuery ajax で POST する」のとを混同されていたようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問