jQueryを使用してフォーム入力フィールドを取得しますか?


412

多くの入力フィールドを持つフォームがあります。

jQueryでフォーム送信イベントをキャッチすると、そのフォームのすべての入力フィールドを連想配列で取得できますか?


23
それは良い質問です。実際、jQueryがこれを正確に行う関数を持たないのは本当に奇妙だと思います。2つの異なる形式でフォームデータを取得する関数がありますが、スクリプトで最も便利なものではありません。スクリプト(おそらく、.val()は、フォーム要素で呼び出された場合、そのような配列を返す必要がありますか?)
Luke Maurer

回答:


524
$('#myForm').submit(function() {
    // get all the inputs into an array.
    var $inputs = $('#myForm :input');

    // not sure if you wanted this, but I thought I'd add it.
    // get an associative array of just the values.
    var values = {};
    $inputs.each(function() {
        values[this.name] = $(this).val();
    });

});

Simon_Weaverからのヒントのおかげで、これを使用して実行できる別の方法を以下に示しますserializeArray

var values = {};
$.each($('#myForm').serializeArray(), function(i, field) {
    values[field.name] = field.value;
});

このスニペットは<select multiple>要素で失敗することに注意してください。

と思われる新しいHTML 5フォームの入力がで動作しないserializeArrayjQueryのバージョン1.3に。これはバージョン1.4以降で機能します


1
jQueryの新しいバージョンでは、Simon_Weaverの答えはより堅牢で簡単です。
MightyE

1
@MightyE&@Simon_Weaver-そうです、それはより堅牢な方法ですが、OPが求めていたものを正確には実行しません。serializeArrayは、プロパティnameとを持つオブジェクトの配列を返しますvalue。より良い解決策は、serializeArrayからの出力を必要な形式に処理することです。
-nickf

1
私はserializeArray()があなたが望んでいることを正確に実行し、コードがはるかに少ないと思います。
滑らかな

1
最初のオプションでは、<select>要素はどうですか?試しましvar $inputs = $('#new-ticket :input, :select');たがうまくいきません。私がそうしているとは思えないので、これを行う適切な方法を誰かが知っていますか?
ネイサン

2
@ネイサン、使用する必要があります$("#new-ticket :input, #new-ticket :select")、またはそれ以上$(":input, :select", "#new-ticket")
nickf

252

この質問についてはパーティーに遅れますが、これはさらに簡単です。

$('#myForm').submit(function() {
    // Get all the forms elements and their values in one step
    var values = $(this).serialize();

});

8
これは本当に最良の答えです。入力フィールドに使用できる配列のフォーマットも保持します。たとえばニックネームによる回答が、Zend_Formを使用して形成された場合、実際にはデータ構造をそのまま維持するとは思わない。たとえば、入力の名前としてfield [something]とfield [something_else]がある場合...少なくとも意味的に、どうなるかわかりません...
msumme

43
jQuery APIのドキュメントによると、.serialize()api.jquery.com/serialize)は、フォームのすべての要素を単一の文字列に入れて、クエリ文字列のURLに追加できるようにし、基本的にGETフォームリクエストを模倣します。これは、nickfの答えが達成することを達成しません。
クリストファーパーカー

これが一番の答えです!
ダニエルハンター

5
知っ.serialize()ているだけの価値:フォーム要素だけでも機能します。したがって$('form select').serialize()、selectに対してのみデータをシリアル化します。
2012年

3
を繰り返すの$('#myForm')ではなく、$(this)を使用します。
ジモシー2014

23

jquery.formのプラグインは、他の人がこの質問にその最後まで何を探していると役立つことがあります。それがあなたが望むことを直接行うかどうかはわかりません。

serializeArray関数もあります。


15

一度に1つずつ取得する方が便利な場合があります。そのため、これがあります:

var input_name = "firstname";
var input = $("#form_id :input[name='"+input_name+"']"); 

これに追加[0].valueする$(...)[0].value;と、直接入力の値が得られます。ありがとうございます。
ポーコマラミレス

12
$('#myForm').bind('submit', function () {
  var elements = this.elements;
});

elements変数には、フォーム内のすべての入力、select、textareas、fieldsetが含まれます。


9

これが別のソリューションです。この方法で、フォームに関するすべてのデータをフェッチし、サーバーサイドの呼び出しなどで使用できます。

$('.form').on('submit', function( e )){ 
   var form = $( this ), // this will resolve to the form submitted
       action = form.attr( 'action' ),
         type = form.attr( 'method' ),
         data = {};

     // Make sure you use the 'name' field on the inputs you want to grab. 
   form.find( '[name]' ).each( function( i , v ){
      var input = $( this ), // resolves to current input element.
          name = input.attr( 'name' ),
          value = input.val();
      data[name] = value;
   });

  // Code which makes use of 'data'.

 e.preventDefault();
}

次に、これをajax呼び出しで使用できます。

function sendRequest(action, type, data) {
       $.ajax({
            url: action,
           type: type,
           data: data
       })
       .done(function( returnedHtml ) {
           $( "#responseDiv" ).append( returnedHtml );
       })
       .fail(function() {
           $( "#responseDiv" ).append( "This failed" );
       });
}

これがあなたのために役立つことを願っています:)


5

少しひねりを加えた同様の問題があり、私はこれを捨てると思いました。フォームを取得するコールバック関数があるので、フォームオブジェクトが既にあり、で簡単にバリアントを作成できませんでした$('form:input')。代わりに私は思いつきました:

    var dataValues = {};
    form.find('input').each(
        function(unusedIndex, child) {
            dataValues[child.name] = child.value;
        });

その状況は似ていますが同一ではありませんが、このスレッドは非常に有用であると私は思いました。私は最後にこれを隠し、他の誰かがそれが有用であることを願っていると思います。


4

連想?いくつかの作業がないわけではありませんが、汎用セレクターを使用できます。

var items = new Array();

$('#form_id:input').each(function (el) {
    items[el.name] = el;
});

実際、ランスの答えは連想配列をPOST値に対してそのままにし、なんと1行のコードをとります。
msumme 2010年

なぜアイテムは配列ですか?プレーンオブジェクトのように使用しています。ここではアレイの必要はありません
ジョナサンモラレスベレス

3
@JonathanMoralesVélez2008のOliのコメントはありません。2015年はあなたに同意します。
Oli

4

jQueryにserializeArrayは無効化されたフィールドが含まれていないため、それらも必要な場合は、以下を試してください。

var data = {};
$('form.my-form').find('input, textarea, select').each(function(i, field) {
    data[field.name] = field.value;
});


4

チェックボックスとラジオボタンを忘れないでください-

var inputs = $("#myForm :input");
var obj = $.map(inputs, function(n, i) {
  var o = {};
  if (n.type == "radio" || n.type == "checkbox")
    o[n.id] = $(n).attr("checked");
  else
    o[n.id] = $(n).val();
  return o;
});
return obj

3

このコードは 名前の代わりに機能します。フォームフィールド名を電子メールで入力してください

$(document).ready(function(){
  $("#form_id").submit(function(event){
    event.preventDefault();
    var name = $("input[name='name']",this).val();
    var email = $("input[name='email']",this).val();
  });
});

3

リストデータを取得するための簡潔なソリューションを提案したり提案したりしていない人はいないようです。ほとんどのフォームは、1次元オブジェクトにはなりません。

このソリューションの欠点は、もちろん、シングルトンオブジェクトが[0]インデックスでアクセスされる必要があることです。しかし、IMOは、数十行のマッピングソリューションの1つを使用するよりもはるかに優れています。

var formData = $('#formId').serializeArray().reduce(function (obj, item) {
    if (obj[item.name] == null) {
        obj[item.name] = [];
    } 
    obj[item.name].push(item.value);
    return obj;
}, {});

2

同じ問題があり、別の方法で解決しました。

var arr = new Array();
$(':input').each(function() {
 arr.push($(this).val());
});
arr;

すべての入力フィールドの値を返します。$(':input')より具体的になるように変更できます。


2

nickfによって与えられるのと同じソリューションですが、配列入力名が考慮されます。

<input type="text" name="array[]" />

values = {};
$("#something :input").each(function() {
  if (this.name.search(/\[\]/) > 0) //search for [] in name
  {
    if (typeof values[this.name] != "undefined") {
      values[this.name] = values[this.name].concat([$(this).val()])
    } else {
      values[this.name] = [$(this).val()];
    }
  } else {
    values[this.name] = $(this).val();
  }
});

1

入力から複数の値を取得する必要があり、[]を使用して複数の値を持つ入力を定義している場合は、以下を使用できます。

$('#contentform').find('input, textarea, select').each(function(x, field) {
    if (field.name) {
        if (field.name.indexOf('[]')>0) {
            if (!$.isArray(data[field.name])) {
               data[field.name]=new Array();
            }
            data[field.name].push(field.value);
        } else {
            data[field.name]=field.value;
        }
    }                   
});

1

Lance RushingSimon_Weaverの回答に触発された、これは私のお気に入りのソリューションです。

$('#myForm').submit( function( event ) {
    var values = $(this).serializeArray();
    // In my case, I need to fetch these data before custom actions
    event.preventDefault();
});

出力はオブジェクトの配列です。例えば

[{name: "start-time", value: "11:01"}, {name: "end-time", value: "11:11"}]

以下のコードで、

var inputs = {};
$.each(values, function(k, v){
    inputs[v.name]= v.value;
});

その最終的な出力は

{"start-time":"11:01", "end-time":"11:01"}

1

各ループなしでこのコードを使用しています:

$('.subscribe-form').submit(function(e){
    var arr=$(this).serializeArray();
    var values={};
    for(i in arr){values[arr[i]['name']]=arr[i]['value']}
    console.log(values);
    return false;
});

1

これが役立つだけでなく、最も簡単なものであることを願っています。

 $("#form").submit(function (e) { 
    e.preventDefault();
    input_values =  $(this).serializeArray();
  });

奇妙なことに、これはjquery 3.4.1の最新バージョンでは機能しませんでした
再演

0

すべてのフォームフィールドでajax呼び出しを行う必要があるとき、チェックされているかどうかに関係なく、すべてのチェックボックスを返す:inputセレクターに問題がありました。新しいセレクターを追加して、送信可能なフォーム要素を取得します。

$.extend($.expr[':'],{
    submitable: function(a){
        if($(a).is(':checkbox:not(:checked)'))
        {
            return false;
        }
        else if($(a).is(':input'))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
});

使用法:

$('#form_id :submitable');

私はまだ複数の選択ボックスでテストしていませんが、標準の送信と同じようにすべてのフォームフィールドを取得するために機能します。

これは、OpenCartサイトの製品オプションをカスタマイズして、チェックボックスとテキストフィールド、および標準の選択ボックスタイプを含めるときに使用しました。


0

serialize()が最善の方法です。@ Christopher Parkerは、Nickfのanwserがより多くのことを成し遂げると言いますが、フォームがテキストエリアと選択メニューを含むかもしれないことを考慮していません。serialize()を使用してから、必要に応じて操作することをお勧めします。serialize()からのデータはAjaxポストまたはgetで使用できるため、そこで問題は発生しません。


0

これが誰かを助けることを願っています。:)

// This html:
// <form id="someCoolForm">
// <input type="text" class="form-control" name="username" value="...." />
// 
// <input type="text" class="form-control" name="profile.first_name" value="...." />
// <input type="text" class="form-control" name="profile.last_name" value="...." />
// 
// <input type="text" class="form-control" name="emails[]" value="..." />
// <input type="text" class="form-control" name="emails[]" value=".." />
// <input type="text" class="form-control" name="emails[]" value="." />
// </form>
// 
// With this js:
// 
// var form1 = parseForm($('#someCoolForm'));
// console.log(form1);
// 
// Will output something like:
// {
// username: "test2"
// emails:
//   0: ".@....com"
//   1: "...@........com"
// profile: Object
//   first_name: "..."
//   last_name: "..."
// }
// 
// So, function below:

var parseForm = function (form) {

    var formdata = form.serializeArray();

    var data = {};

    _.each(formdata, function (element) {

        var value = _.values(element);

        // Parsing field arrays.
        if (value[0].indexOf('[]') > 0) {
            var key = value[0].replace('[]', '');

            if (!data[key])
                data[key] = [];

            data[value[0].replace('[]', '')].push(value[1]);
        } else

        // Parsing nested objects.
        if (value[0].indexOf('.') > 0) {

            var parent = value[0].substring(0, value[0].indexOf("."));
            var child = value[0].substring(value[0].lastIndexOf(".") + 1);

            if (!data[parent])
                data[parent] = {};

            data[parent][child] = value[1];
        } else {
            data[value[0]] = value[1];
        }
    });

    return data;
};

0

すべての答えは良いですが、その関数で無視したいフィールドがある場合はどうしますか?簡単です。たとえば、ignore_thisのようにフィールドにプロパティを指定します。

<input type="text" name="some_name" ignore_this>

そしてあなたのシリアライズ関数で:

if(!$(name).prop('ignorar')){
   do_your_thing;
}

これは、一部のフィールドを無視する方法です。


1
元の質問には答えないので、これは答えというよりはコメントです。
Wai Ha Lee

多分彼はすでにたくさんの答えを持っているからでしょうか?それは彼が受け取った答えを補完するものです。
Marcelo Rocha

入力は記入されなければならない場合、私は必須のようなクラス名でこれを実装し、その後、私は確認することができます。$('.mandatory');そして!$('.mandatory');
lharby

w3cを検証しない独自の属性を作成ignore_thisするdata-ignore-this="true"代わりに変更
zanderwar


0

複数の選択要素(<select multiple="multiple">)について、@ Jason Norwood-Youngのソリューションを変更して機能させました。

回答(投稿されたまま)は、選択された最初の要素からの値のみを取得し、それらのすべてを取得しません。またdata、初期化も戻りもせず、前者はJavaScriptエラーをスローしました。

ここに新しいバージョンがあります:

function _get_values(form) {
  let data = {};
  $(form).find('input, textarea, select').each(function(x, field) {
    if (field.name) {
      if (field.name.indexOf('[]') > 0) {
        if (!$.isArray(data[field.name])) {
          data[field.name] = new Array();
        }
        for (let i = 0; i < field.selectedOptions.length; i++) {
          data[field.name].push(field.selectedOptions[i].value);
        }

      } else {
        data[field.name] = field.value;
      }
    }

  });
  return data
}

使用法:

_get_values($('#form'))

注:name選択のがその[]末尾に追加されていることを確認する必要があるだけです。次に例を示します。

<select name="favorite_colors[]" multiple="multiple">
  <option value="red">Red</option>
  <option value="green">Green</option>
  <option value="blue">Blue</option>
</select>

-1
$("#form-id").submit(function (e) { 
  e.preventDefault();
  inputs={};
  input_serialized =  $(this).serializeArray();
  input_serialized.forEach(field => {
    inputs[field.name] = field.value;
  })
  console.log(inputs)
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.