JavaScript / jQueryでフォームデータを取得するにはどうすればよいですか?


404

フォームのデータを従来のHTMLのみで送信する場合のように、フォームのデータを取得する簡単な1行の方法はありますか?

例えば:

<form>
    <input type="radio" name="foo" value="1" checked="checked" />
    <input type="radio" name="foo" value="0" />
    <input name="bar" value="xxx" />
    <select name="this">
        <option value="hi" selected="selected">Hi</option>
        <option value="ho">Ho</option>
</form>

出力:

{
    "foo": "1",
    "bar": "xxx",
    "this": "hi"
}

このようなものは単純すぎます。テキストエリア、選択、ラジオボタン、チェックボックスが(正しく)含まれていないためです。

$("#form input").each(function () {
    data[theFieldName] = theFieldValue;
});

回答:


431
$('form').serialize() //this produces: "foo=1&bar=xxx&this=hi"

デモ


15
近いですが、単一の文字列ではなく、キーと値のペアを持つ配列を返すものでしょうか?
Bart van Heukelom、2010

80
Nvm、それをserialize()関数のコメントで見つけました。これは、serializeArrayと呼ばれます。配列の配列(「名前」と「値」のエントリを含む)を返しますが、変換は簡単です。
Bart van Heukelom、2010

22
そして、アンダースコアライブラリを使用すると、使用して変換することができます_.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))
MhdSyrwan

8
@BartvanHeukelom私はこれが4年後であることを知っていますが、.serializeArray()は配列を返します。
TJ WealthEngine APIエバンジェリスト2014

6
すべてのinputタグにname属性が含まれていることを確認してください。含まれていない場合は何も返されません。
Eugene Kulabuhov 2015年

505

配列$('form').serializeArray()を返すを使用します。

[
  {"name":"foo","value":"1"},
  {"name":"bar","value":"xxx"},
  {"name":"this","value":"hi"}
]

その他のオプションは$('form').serialize()で、文字列を返します

"foo=1&bar=xxx&this=hi"

このjsfiddleデモを見てください


91
serializeArrayキーと値のペアを持つオブジェクトが返された場合は、さらに便利です
GetFree

8
オブジェクトが理想的であることに同意します。ただし、問題があります-キーは複数の値を持つことができます。キー「値の配列」オブジェクト、またはキー「最初の値」などを返しますか?jQueryの人たちは上記のどれも選択しなかったと思います:)
Paul

複数の値(上記の@Paulと同様)、チェックボックス、および複数の入力に関する問題が機能しないことに注意してくださいname="multiple[]"。POSTメソッドのソリューションは同じですが、$( 'form')。serialize()を使用するだけです。また、POSTメソッドは、ほとんどのブラウザーでGETが行うような2000文字の制限がないため、かなり大きなデータに対しても使用できます。
Artru 2016

また、フォーム入力の値を記録するには、入力にname属性が必要であることに注意してください。
クリス-Jr

@GetFree jQuery map関数を使用しないのはなぜですか?function getFormData(form){var rawJson = form.serializeArray(); var model = {}; $ .map(rawJson、function(n、i){model [n ['name']] = n ['value'];}); モデルを返す; }
トム・マクドナー

196

2014年の更新された回答: HTML5 FormDataはこれを行います

var formData = new FormData(document.querySelector('form'))

その後、formDataをそのまま送信できます。フォームで使用されるすべての名前と値が含まれます。


13
さらに、FormDataは1つで良いと便利ですが、FormData内のデータを読み取りたい場合、それほど簡単ではありません(stackoverflow.com/questions/7752188/…を参照)
StackExchange What The Heck

1
FormDataはXMLHttpRequestの高度な機能(以前はXMLHttpRequestレベル2と呼ばれていました)の一部であるため、Internet Explorer <10のポリフィルに
=

3
@yochannah、そうではありません。もちろん、通常のオブジェクトのように単純にデータにアクセスして編集することはできませんが、データを取得するのは簡単です。entries()メソッド[MDNページ ]を確認してください
ウェブとフロー

@WebとFlowに指摘していただきありがとうございます。ブラウザが新しくて便利な機能を追加するとき、私はそれを愛しています:)時、それらは変化しています。
StackExchange What The Heck

FormDataを使用してオブジェクトをFlask-pythonスクリプトに送信しようとしていますが、通常のリクエストオブジェクトとしてアンパックできるようには見えません。誰かがサーバー側でそれを処理するための特別な手順の説明を指摘できますか?それは私にはそれが空っぽに思われるところです。
manisha

181

に基づいてjQuery.serializeArray、キーと値のペアを返します。

var data = $('#form').serializeArray().reduce(function(obj, item) {
    obj[item.name] = item.value;
    return obj;
}, {});

12
みんな、ここにキーと値のペアがあります!黄金だ!!! ありがとう!「retailer」という名前の要素の値が必要な場合は、このコンソールを実行します。log($( '#form')。serializeArray()。reduce(function(obj、item){obj [item.name] = item。 value; return obj;}、{})['retailer']);
Yevgeniy Afanasyev 2015年

私は昨日、この答えに基づいてJQueryメソッドを作成しましたが、複数選択と入力配列( 'example []'という名前)を使用しています。以下の私の答えでそれを見つけることができます。とにかく、良いアプローチニューロン、ありがとう!:)
manuman94

これは、すべての答えの中で私に最も合っています!
-VPetrovic

この私見が最良の答えです!
Rahul

74
document.querySelector('form').addEventListener('submit', (e) => {
  const formData = new FormData(e.target);
  // Now you can use formData.get('foo'), for example.
  // Don't forget e.preventDefault() if you want to stop normal form .submission
});

これはごちゃごちゃした答えですが、これがより良い解決策である理由を説明しましょう:

  • ボタンを押すのではなく、フォームの送信を適切に処理しています。フィールドにエンターを押し込むのを好む人もいます。一部の人々は、音声入力や他のユーザー補助デバイスなどの代替入力デバイスを使用しています。フォーム送信を処理し、すべての人のために正しく解決します。

  • 送信された実際のフォームのフォームデータを詳しく調べています。後でフォームセレクターを変更する場合、すべてのフィールドのセレクターを変更する必要はありません。さらに、同じ入力名を持つ複数のフォームがある場合があります。過剰なIDを明確にする必要はありません。送信されたフォームに基づいて入力を追跡するだけです。これはまた、あなたが複数のフォームのための単一のイベントハンドラを使用することができます場合はそれがあなたの状況に適しています。

  • FormDataインターフェースはかなり新しいものですが、ブラウザーで十分にサポートされています。これは、データ収集を構築して、フォームの内容の実際の値を取得するための優れた方法です。これがないと、すべての要素をループして(などを使用してform.elements)、何がチェックされているか、何がチェックされていないか、値が何であるかなどを把握する必要があります。インターフェースはシンプルです。

  • ここではES6を使用しています...決して要件ではないので、古いブラウザのサポートが必要な場合は、ES5互換に変更してください。


fyi、FormDataオブジェクトはそれらの値を公開しません。そこからプレーンオブジェクトを取得するには、stackoverflow.com
questions / 41431322 /…を

2
@Blauhirn Nonsense、もちろんそれらは値を公開します。私の答えのコードは機能します。試してみてください。ここで、私はあなたのためにフィドルを作りました: jsfiddle.net/zv9s1xq5 イテレータが必要な場合は、を使用してくださいformData.entries()
ブラッド

私はそれが動作することを知っていますが、プロパティはキーでアクセスできません。たとえば、formData.foo 未定義です。あなたの答えに見られるように、.get() 私が不便だと思うもののために呼ばれる必要があります。多分「公開しない」は間違った方法で出くわした。したがって、イベント{ foo: 'bar' }から何かを生成submitするには、それらを手動で反復する必要があります。したがって. To get a plain object from it, see [link]
phil294 2018年

1
@Blauhirnあなたはそれについて間違っています。XMLHttpRequestはFormDataを直接サポートします。 xhr.send(formData);
ブラッド

1
@Blauhirn JSON.stringify([...formData]) または、キー/値を個別にしたい場合 [...formData].reduce((prev, cur) => { prev[cur[0]] = cur[1]; return prev;}, {})
Brad

25

.serializeArray()を使用してデータを配列形式で取得し、それをオブジェクトに変換します。

function getFormObj(formId) {
    var formObj = {};
    var inputs = $('#'+formId).serializeArray();
    $.each(inputs, function (i, input) {
        formObj[input.name] = input.value;
    });
    return formObj;
}

私のようなものがあれば、これは私のチェックボックスを上書きします<input type="checkbox" name="someList" value="one" /> <input type="checkbox" name="someList" value="two" />。両方がチェックされている場合、オブジェクトには2番目のチェックボックス値のみが含まれます。
dmathisen、2015年

2
これはあるsomeListべきケースではありませんtype="radio"か?
dylanjameswagner、2015年

upvote受け入れ答えは、のようにキーを持つオブジェクトを返さないので:name:value
マット- -マルクス主義の

24

以下は、Jqueryを必要としない、非常にシンプルで短いソリューションです。

var formElements=document.getElementById("myForm").elements;    
var postData={};
for (var i=0; i<formElements.length; i++)
    if (formElements[i].type!="submit")//we dont want to include the submit-buttom
        postData[formElements[i].name]=formElements[i].value;

1
これはラジオボタンでは機能しません。最後のオプションは常にに保存されてpostDataいるオプションです。
カイルファルコナー

3
jquery以外の回答をいただきありがとうございます。
グレンピアス

24

それは2019年であり、これを行うためのより良い方法があります:

const form = document.querySelector('form');
const data = new URLSearchParams(new FormData(form).entries());

または、代わりにプレーンオブジェクトが必要な場合

const form = document.querySelector('form');
const data = Object.fromEntries(new FormData(form).entries());

ただし、同じ名前の複数選択と重複チェックボックスから取得するような重複キーでは機能しないことに注意してください。


完全に。document.getElementsByClassNameただし、すべて同じ名前の入力のリストの配列を取得できなかったため、使用する必要があり、forループが必要でしたが、jQueryなどを必要とするよりも優れています
alphanumeric0101

1
この答えは私のお気に入りです。しかし、それdocument.querySelectorだけではなく読む必要がありますquerySelector
アダブル

-ノート「いるFormDataはname属性を使用した入力フィールドを使用します」MDN
binaryfunt


13

私はこれを使います:

jQueryプラグイン

(function($){
  $.fn.getFormData = function(){
    var data = {};
    var dataArray = $(this).serializeArray();
    for(var i=0;i<dataArray.length;i++){
      data[dataArray[i].name] = dataArray[i].value;
    }
    return data;
  }
})(jQuery);

HTMLフォーム

<form id='myform'>
  <input name='myVar1' />
  <input name='myVar2' />
</form>

データを取得する

var myData = $("#myForm").getFormData();

このプラグインは、同じ名前のフォーム入力エントリが複数存在する場合は機能しないことに注意してください。最後のエントリは以前のエントリを置き換えますが、予想される動作はすべての値を次のように取得することですArray
Milli

1
1年後の今、これは恐ろしい答えであり、だれもそれを使用するべきではないと思います。前のコメントにあるように、ラジオボタンなどは機能しません。上記のより良い答えがあります。代わりにそれらの1つを使用してください。
ダスティンポワサント2017

12
$("#form input, #form select, #form textarea").each(function() {
 data[theFieldName] = theFieldValue;
});

それ以外の場合は、serialize()を確認することをお勧めします。


11

チェックボックス、ラジオボタン、およびスライダー(おそらく他の入力タイプも同様ですが、私はこれらのみをテストしました)を正しく処理する、JavaScriptのみで機能する実装です。

function setOrPush(target, val) {
    var result = val;
    if (target) {
        result = [target];
        result.push(val);
    }
    return result;
}

function getFormResults(formElement) {
    var formElements = formElement.elements;
    var formParams = {};
    var i = 0;
    var elem = null;
    for (i = 0; i < formElements.length; i += 1) {
        elem = formElements[i];
        switch (elem.type) {
            case 'submit':
                break;
            case 'radio':
                if (elem.checked) {
                    formParams[elem.name] = elem.value;
                }
                break;
            case 'checkbox':
                if (elem.checked) {
                    formParams[elem.name] = setOrPush(formParams[elem.name], elem.value);
                }
                break;
            default:
                formParams[elem.name] = setOrPush(formParams[elem.name], elem.value);
        }
    }
    return formParams;
}

作業例:

    function setOrPush(target, val) {
      var result = val;
      if (target) {
        result = [target];
        result.push(val);
      }
      return result;
    }

    function getFormResults(formElement) {
      var formElements = formElement.elements;
      var formParams = {};
      var i = 0;
      var elem = null;
      for (i = 0; i < formElements.length; i += 1) {
        elem = formElements[i];
        switch (elem.type) {
          case 'submit':
            break;
          case 'radio':
            if (elem.checked) {
              formParams[elem.name] = elem.value;
            }
            break;
          case 'checkbox':
            if (elem.checked) {
              formParams[elem.name] = setOrPush(formParams[elem.name], elem.value);
            }
            break;
          default:
            formParams[elem.name] = setOrPush(formParams[elem.name], elem.value);
        }
      }
      return formParams;
    }

    //
    // Boilerplate for running the snippet/form
    //

    function ok() {
      var params = getFormResults(document.getElementById('main_form'));
      document.getElementById('results_wrapper').innerHTML = JSON.stringify(params, null, ' ');
    }

    (function() {
      var main_form = document.getElementById('main_form');
      main_form.addEventListener('submit', function(event) {
        event.preventDefault();
        ok();
      }, false);
    })();
<form id="main_form">
  <div id="questions_wrapper">
    <p>what is a?</p>
    <div>
      <input type="radio" required="" name="q_0" value="a" id="a_0">
      <label for="a_0">a</label>
      <input type="radio" required="" name="q_0" value="b" id="a_1">
      <label for="a_1">b</label>
      <input type="radio" required="" name="q_0" value="c" id="a_2">
      <label for="a_2">c</label>
      <input type="radio" required="" name="q_0" value="d" id="a_3">
      <label for="a_3">d</label>
    </div>
    <div class="question range">
      <label for="a_13">A?</label>
      <input type="range" required="" name="q_3" id="a_13" min="0" max="10" step="1" list="q_3_dl">
      <datalist id="q_3_dl">
        <option value="0"></option>
        <option value="1"></option>
        <option value="2"></option>
        <option value="3"></option>
        <option value="4"></option>
        <option value="5"></option>
        <option value="6"></option>
        <option value="7"></option>
        <option value="8"></option>
        <option value="9"></option>
        <option value="10"></option>
      </datalist>
    </div>
    <p>A and/or B?</p>
    <div>
      <input type="checkbox" name="q_4" value="A" id="a_14">
      <label for="a_14">A</label>
      <input type="checkbox" name="q_4" value="B" id="a_15">
      <label for="a_15">B</label>
    </div>
  </div>
  <button id="btn" type="submit">OK</button>
</form>
<div id="results_wrapper"></div>

編集:

より完全な実装を探している場合は、私が作成したプロジェクトのこのセクションをご覧ください。私は最終的に私が思いついた完全な解決策でこの質問を更新しますが、多分これは誰かに役立つでしょう。


1
素晴らしい解決策:) setOrPush関数を使用して、1つのバグを見つけました。targetがすでに配列であるかどうかを確認するチェックは含まれていないため、同じ名前のチェックボックスが複数オンになっている場合は、深くネストされた配列が作成されます。
Wouter van Dam

@KyleFalconerいいね!なぜラジオとチェックボックスのスイッチケースをマージしなかったのですか?それらは正しく動作します(私は推測しています)。
イーサン

@Ethanこれは、チェックボックスで複数の値を選択でき、ラジオでは1つの値しか選択できないため、値の変更を保存する方法です。
カイルファルコナー2017

@KyleFalconerはい、私はそれを理解しています。「チェックボックス」を処理するコードは、「SetOrPush」ルーチンのおかげで、「ラジオ」の1つの可能な選択肢も処理します。
イーサン

@イーサンああ、私はあなたが言っていることがわかっていると思います。どちらの方法でも可能ですが、値の配列ではなく1つの値だけが必要だったという理由だけで、この方法で行ったと思います。
カイルファルコナー

9

jQueryを使用している場合は、探していることを実行する小さな関数を次に示します。

最初に、フォームにIDを追加します(ページ上の唯一のフォームでない限り、domクエリとして「フォーム」を使用できます)。

<form id="some-form">
 <input type="radio" name="foo" value="1" checked="checked" />
 <input type="radio" name="foo" value="0" />
 <input name="bar" value="xxx" />
 <select name="this">
  <option value="hi" selected="selected">Hi</option>
  <option value="ho">Ho</option>
</form>

<script>
//read in a form's data and convert it to a key:value object
function getFormData(dom_query){
    var out = {};
    var s_data = $(dom_query).serializeArray();
    //transform into simple data/value object
    for(var i = 0; i<s_data.length; i++){
        var record = s_data[i];
        out[record.name] = record.value;
    }
    return out;
}

console.log(getFormData('#some-form'));
</script>

出力は次のようになります。

{
 "foo": "1",
 "bar": "xxx",
 "this": "hi"
}

7

FormDataオブジェクトを使用することもできます。FormDataオブジェクトを使用すると、XMLHttpRequestを使用して送信するキーと値のペアのセットをコンパイルできます。これは主にフォームデータの送信に使用することを目的としていますが、キーのあるデータを送信するためにフォームから独立して使用できます。

        var formElement = document.getElementById("myform_id");
        var formData = new FormData(formElement);
        console.log(formData);

ありがとう、でもIDがないとどうなる?JQueryオブジェクトとしてフォームがある場合はどうなりますか?var form = $(this).closest( 'form'); ?var formElement = document.getElementById(form [0]); 代わりにあなたのもみラインを働きますか?残念ながら、うまくいきません。なぜなのかご存知ですか?
Yevgeniy Afanasyev 2015年

実際には、FormDataはすべてのブラウザでサポートされているわけではありません:(別のアプローチを使用することをお
勧めします

ありがとう。私は最新のクロムを使用しましたが、それでも機能しませんでした。だから私はここから#neurontの回答で行きました。
Yevgeniy Afanasyev 2015年

6

これにより、すべてのフォームフィールドがJavaScriptオブジェクト「res」に追加されます。

var res = {};
$("#form input, #form select, #form textarea").each(function(i, obj) {
    res[obj.name] = $(obj).val();
})

これと同じ答えは、すでに2010年に投稿されたためか
nathanvda

知らなかった。そのような短い答えのために、これは驚くべきことではありません。それでも、リファレンスはどこにありますか?
gamliela 2015年

マジ?あなたは参照なしで私のコメントを信じていませんし、それらが同じであるかどうかを確認するために回答のリストを見ることさえできませんか?stackoverflow.com/a/2276469/216513
nathanvda 2015年

別の質問の答えを意味すると思いました。詳細と理由は今は覚えていません。まったく同じではないかもしれない
gamliela 2015年

1
入力用に機能させたい人にとっては完璧な答えです。複数のテキストエリアを選択してください。なぜなら、serializeを使用すると、selectタグで選択されているすべてのアイテムを取得できないからです。ただし、.val()を使用すると、配列として必要なものが正確に得られます。単純明快な答え。
Sailesh Kotha 2017

6

必要なオブジェクトも返すための回答を含めました。

function getFormData(form) {
var rawJson = form.serializeArray();
var model = {};

$.map(rawJson, function (n, i) {
    model[n['name']] = n['value'];
});

return model;
}

これは配列をまったく扱いません。foo[bar][] = 'qux'にシリアル化する必要があり{ foo: { bar: [ 'qux' ] } }ます。
amphetamachine

6

ニューロンの応答に基づいて、フォームデータをキーと値のペアで取得する単純なJQueryメソッドを作成しましたが、これは複数選択およびname = 'example []'の配列入力に対して機能します。

これは、次のように使用されます。

var form_data = $("#form").getFormObject();

その定義とその仕組みの例を以下に示します。

// Function start
$.fn.getFormObject = function() {
    var object = $(this).serializeArray().reduce(function(obj, item) {
        var name = item.name.replace("[]", "");
        if ( typeof obj[name] !== "undefined" ) {
            if ( !Array.isArray(obj[name]) ) {
                obj[name] = [ obj[name], item.value ];
            } else {
               obj[name].push(item.value);
            }
        } else {
            obj[name] = item.value;
        }
        return obj;
    }, {});
    return object;
}
// Function ends

// This is how it's used
$("#getObject").click( function() {
  var form_data = $("#form").getFormObject();
  console.log(form_data);
});
/* Only to make view better ;) */
#getObject {
  padding: 10px;
  cursor:pointer;
  background:#0098EE;
  color:white;
  display:inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<form id="form">
  <input type="text" name="text" value="Hola amigo" /> 
  
  <input type="text" name="text_array[]" value="Array 1" /> 
  <input type="text" name="text_array[]" value="Array 2" /> 
  <input type="text" name="text_array[]" value="Array 3" /> 
  
  <select name="multiselect" multiple>
    <option name="option1" selected> option 1 </option>
    <option name="option2" selected> option 2 </option>
  </select>
  
  <input type="checkbox" name="checkbox" value="checkbox1" checked/>
  <input type="checkbox" name="checkbox" value="checkbox2" checked/>
  
  <input type="radio" name="radio" value="radio1" checked/>
  <input type="radio" name="radio" value="radio2"/>

</form>

<div id="getObject"> Get object (check the console!) </div>


5
var formData = new FormData($('#form-id'));
params   = $('#form-id').serializeArray();

$.each(params, function(i, val) {
    formData.append(val.name, val.value);
});

4
function getFormData($form){
    var unindexed_array = $form.serializeArray();
    var indexed_array = {};

    $.map(unindexed_array, function(n, i){
        if(indexed_array[n['name']] == undefined){
            indexed_array[n['name']] = [n['value']];
        }else{
            indexed_array[n['name']].push(n['value']);
        }
    });

    return indexed_array;
}

4

この関数を使用して、フォームからオブジェクトまたはJSONを取得できます。

それを使用するため:

var object = formService.getObjectFormFields("#idform");

 function  getObjectFormFields(formSelector)
        {
            /// <summary>Função que retorna objeto com base nas propriedades name dos elementos do formulário.</summary>
            /// <param name="formSelector" type="String">Seletor do formulário</param>

            var form = $(formSelector);

            var result = {};
            var arrayAuxiliar = [];
            form.find(":input:text").each(function (index, element)
            {
                var name = $(element).attr('name');

                var value = $(element).val();
                result[name] = value;
            });

            form.find(":input[type=hidden]").each(function (index, element)
            {
                var name = $(element).attr('name');
                var value = $(element).val();
                result[name] = value;
            });


            form.find(":input:checked").each(function (index, element)
            {
                var name;
                var value;
                if ($(this).attr("type") == "radio")
                {
                    name = $(element).attr('name');
                    value = $(element).val();
                    result[name] = value;
                }
                else if ($(this).attr("type") == "checkbox")
                {
                    name = $(element).attr('name');
                    value = $(element).val();
                    if (result[name])
                    {
                        if (Array.isArray(result[name]))
                        {
                            result[name].push(value);
                        } else
                        {
                            var aux = result[name];
                            result[name] = [];
                            result[name].push(aux);
                            result[name].push(value);
                        }

                    } else
                    {
                        result[name] = [];
                        result[name].push(value);
                    }
                }

            });

            form.find("select option:selected").each(function (index, element)
            {
                var name = $(element).parent().attr('name');
                var value = $(element).val();
                result[name] = value;

            });

            arrayAuxiliar = [];
            form.find("checkbox:checked").each(function (index, element)
            {
                var name = $(element).attr('name');
                var value = $(element).val();
                result[name] = arrayAuxiliar.push(value);
            });

            form.find("textarea").each(function (index, element)
            {
                var name = $(element).attr('name');
                var value = $(element).val();
                result[name] = value;
            });

            return result;
        }


2
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
Wahyu Kristianto

しかし、このリンクには彼を助ける機能があると思います。しかし、次回はコードを配置します。
Marcos Costa

3

私はこのまさに問題を解決するためにライブラリを書きました:JSONFormsました。フォームを取り、各入力を通過し、簡単に読み取ることができるJSONオブジェクトを構築します。

次のフォームがあるとします。

<form enctype='application/json'>
  <input name='places[0][city]' value='New York City'>
  <input type='number' name='places[0][population]' value='8175133'>
  <input name='places[1][city]' value='Los Angeles'>
  <input type='number' name='places[1][population]' value='3792621'>
  <input name='places[2][city]' value='Chicago'>
  <input type='number' name='places[2][population]' value='2695598'>
</form>

フォームをJSONFormsのエンコードメソッドに渡すと、次のオブジェクトが返されます。

{
  "places": [
    {
      "city": "New York City",
      "population": 8175133
    },
    {
      "city": "Los Angeles",
      "population": 3792621
    },
    {
      "city": "Chicago",
      "population": 2695598
    }
  ]
}

これがフォームのデモです。


見栄えがよく、うまく動作します。ありがとうございます。1つだけ、縮小バージョンはマップファイルを呼び出し、オプションのimoである必要があります。
adi518

2

$( "form" ).bind( "submit", function(e) {
    e.preventDefault();
    
    console.log(  $(this).serializeObject() );    

    //console.log(  $(this).serialize() );
    //console.log(  $(this).serializeArray() );

});


$.fn.serializeObject = function() {
    var o = {};
    var a = this.serializeArray();

    $.each( a, function() {
        if ( o[this.name] !== undefined) 
        {
            if ( ! o[this.name].push ) 
            {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        }
        else 
        {
            o[this.name] = this.value || '';
        }
    });

    return o;
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<form>

    <input type="radio" name="foo" value="1" checked="checked" />
    <input type="radio" name="foo" value="0" />
    <input name="bar" value="xxx" />

    <select name="this">
        <option value="hi" selected="selected">Hi</option>
        <option value="ho">Ho</option>
    </select>

    <input type="submit" value="Submit" />

</form>

Codepen


2

Objectシリアル化された文字列(によって返される文字列$(form).serialize()やのわずかな改善など$(form).serializeArray())ではなくを好む方は、以下のコードを自由に使用してください。

var Form = {
    _form: null,
    _validate: function(){
        if(!this._form || this._form.tagName.toLowerCase() !== "form") return false;
        if(!this._form.elements.length) return false;
    }, _loopFields: function(callback){
        var elements = this._form.elements;
        for(var i = 0; i < elements.length; i++){
            var element = form.elements[i];
            if(name !== ""){
                callback(this._valueOfField(element));
            }
        }
    }, _valueOfField: function(element){
        var type = element.type;
        var name = element.name.trim();
        var nodeName = element.nodeName.toLowerCase();
        switch(nodeName){
            case "input":
                if(type === "radio" || type === "checkbox"){
                    if(element.checked){
                        return element.value;
                    }
                }
                return element.value;
                break;
            case "select":
                if(type === "select-multiple"){
                    for(var i = 0; i < element.options.length; i++){
                        if(options[i].selected){
                            return element.value;
                        }
                    }
                }
                return element.value;
                break;
            case "button":
                switch(type){
                    case "reset": 
                    case "submit": 
                    case "button":
                        return element.value;
                        break;
                }
                break;
        } 
    }, serialize: function(form){
        var data = {};
        this._form = form;

        if(this._validate()){
            this._loopFields(function(value){
                if(value !== null) data[name] = value;
            });
        }
        return data;
    }
};

それを実行するには、単に使用するForm.serialize(form)と、関数は次のようなObjectものを返します。

<!-- { username: "username", password: "password" } !-->
<input type="text" value="username">
<input type="password" value="password">

おまけとして、これは、1つのシリアライズ関数のためだけにjQueryのバンドル全体をインストールする必要がないことを意味します。


1

複数のチェックボックスと複数の選択を処理する関数を作成しました。それらの場合、それは配列を返します。

function getFormData(formId) {
    return $('#' + formId).serializeArray().reduce(function (obj, item) {
        var name = item.name,
            value = item.value;

        if (obj.hasOwnProperty(name)) {
            if (typeof obj[name] == "string") {
                obj[name] = [obj[name]];
                obj[name].push(value);
            } else {
                obj[name].push(value);
            }
        } else {
            obj[name] = value;
        }
        return obj;
    }, {});
}

1

フォームの入力要素フィールドと入力ファイルを表示して、ページを更新せずにフォームを送信し、ここにファイルが含まれているすべての値を取得します

<form id="imageUploadForm"   action="" method="post" enctype="multipart/form-data">
<input type="text" class="form-control" id="fname" name='fname' placeholder="First Name" >
<input type="text" class="form-control" name='lname' id="lname" placeholder="Last Name">
<input type="number" name='phoneno'  class="form-control" id="phoneno" placeholder="Phone Number">
<textarea class="form-control" name='address' id="address" rows="5" cols="5" placeholder="Your Address"></textarea>
<input type="file" name="file" id="file" >
<input type="submit" id="sub" value="Registration">					   
</form>
[送信]ボタンのページでajaxリクエストをphpファイルに送信します。
$('#imageUploadForm').on('submit',(function(e) 
{
     fname = $('#fname').val();
     lname =  $('#lname').val();
     address =  $('#address').val();
     phoneno =  $('#phoneno').val();
     file =  $('#file').val();
     e.preventDefault();
     var formData = new FormData(this);
     formData.append('file', $('#file')[0]);
     formData.append('fname',$('#fname').val());
     formData.append('lname',$('#lname').val());
     formData.append('phoneno',$('#phoneno').val());
     formData.append('address',$('#address').val());
     $.ajax({
		type:'POST',
                url: "test.php",
                //url: '<?php echo base_url().'edit_profile/edit_profile2';?>',

                data:formData,
                cache:false,
                contentType: false,
                processData: false,
                success:function(data)
                {
                     alert('Data with file are submitted !');

                }

     });

}))


ここで新しいFormDataの必要性は何ですか?
Sahu V Kumar

1
@VishalKumarSahuファイルをアップロードしているので、formDataを使用しています。
Mohsin Shoukat

1
$(form).serializeArray().reduce(function (obj, item) {
      if (obj[item.name]) {
           if ($.isArray(obj[item.name])) {
               obj[item.name].push(item.value);
           } else {
                var previousValue = obj[item.name];
                obj[item.name] = [previousValue, item.value];
           }
      } else {
           obj[item.name] = item.value;
      }

     return obj;
}, {});

これは問題を修正します。複数選択では機能しませんでした。


0

あなたはすべて完全に正しくはありません。あなたは書くことができません:

formObj[input.name] = input.value;

このように複数選択リストがある場合-"param1": "value1"、 "param1": "value2"として送信されるため、その値は最後のリストで上書きされます。

したがって、正しいアプローチは次のとおりです。

if (formData[input.name] === undefined) {
    formData[input.name] = input.value;
}
else {
    var inputFieldArray = $.merge([], $.isArray(formData[input.name]) ? formData[input.name] : [formData[input.name]]);
    $.merge(inputFieldArray, [input.value]);
    formData[input.name] = $.merge([], inputFieldArray);
}

0

このメソッドはそれを行う必要があります。フォームデータをシリアル化し、オブジェクトに変換します。チェックボックスのグループも処理します。

function getFormObj(formId) {
  var formParams = {};
  $('#' + formId)
    .serializeArray()
    .forEach(function(item) {
      if (formParams[item.name]) {
        formParams[item.name] = [formParams[item.name]];
        formParams[item.name].push(item.value)
      } else {
        formParams[item.name] = item.value
      }
    });
  return formParams;
}

チェックボックスでは機能しますが、コントロールがname属性を共有するラジオボタンでは機能しません。
カイルファルコナー

0

これが、フォームデータをオブジェクトとして抽出するために私が書いた素晴らしいバニラJS関数です。また、オブジェクトに追加を挿入したり、フォーム入力フィールドをクリアしたりするためのオプションもあります。

const extractFormData = ({ form, clear, add }) => {
  return [].slice.call(form.children).filter(node => node.nodeName === 'INPUT')
  .reduce((formData, input) => {
    const value = input.value
    if (clear) { input.value = '' }
    return {
      ...formData,
      [input.name]: value
    }
  }, add)
}

以下は、postリクエストでの使用例です。

submitGrudge(e) {
  e.preventDefault()

  const form = e.target
  const add = { id: Date.now(), forgiven: false }
  const grudge = extractFormData({ form, add, clear: true })

  // grudge = {
  //  "name": "Example name",
  //  "offense": "Example string",
  //  "date": "2017-02-16",
  //  "id": 1487877281983,
  //  "forgiven": false
  // }

  fetch('http://localhost:3001/api/grudge', {
    method: 'post',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(grudge)
  })
    .then(response => response.json())
    .then(grudges => this.setState({ grudges }))
    .catch(err => console.log('error: ', err))
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.