我有一个带有许多输入字段的表单。

当我用jQuery捕获提交表单事件时,是否有可能在一个关联数组中获得该表单的所有输入字段?


当前回答

受到Lance Rushing和Simon_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"}

其他回答

http://api.jquery.com/serializearray/

$('#form').on('submit', function() {
    var data = $(this).serializeArray();
});

这也可以在没有jQuery的情况下使用XMLHttpRequest Level 2 FormData对象完成

http://www.w3.org/TR/2010/WD-XMLHttpRequest2-20100907/#the-formdata-interface

var data = new FormData([form])

也有类似的问题,只是稍微有点扭曲,我想我应该把它扔掉。我有一个回调函数,得到的形式,所以我已经有一个形式对象,不能简单的变量$('form:input')。相反,我想到了:

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

它类似但不完全相同的情况,但我发现这条线索非常有用,我想我会把它塞在末尾,希望其他人也能发现它有用。

似乎很奇怪,没有人赞成或提出一个简洁的解决方案来获得列表数据。几乎没有任何形式是一维对象。

当然,这种解决方案的缺点是必须在[0]索引处访问单例对象。但在我看来,这比使用12行映射解决方案要好得多。

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

与nickf给出的解决方案相同,但考虑了数组输入名称 如

<输入类型=“文本”

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();
  }
});

所有答案都很好,但如果函数中有一个字段你想忽略?简单,给字段一个属性,例如ignore_this:

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

在你的Serialize函数中:

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

这是忽略某些字段的方法。