如何使用JavaScript/jQuery获取表单数据?

Bar*_*lom 373 javascript forms jquery

是否有一种简单的单行方式来获取表单的数据,如果它是以经典的HTML方式提交的话?

例如,在:

<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>
Run Code Online (Sandbox Code Playgroud)

日期:

{
    "foo": "1",
    "bar": "xxx",
    "this": "hi"
}
Run Code Online (Sandbox Code Playgroud)

这样的事情太简单了,因为它没有(正确地)包括textareas,选择,单选按钮和复选框:

$("#form input").each(function () {
    data[theFieldName] = theFieldValue;
});
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 475

使用$('form').serializeArray(),返回一个数组:

[
  {"name":"foo","value":"1"},
  {"name":"bar","value":"xxx"},
  {"name":"this","value":"hi"}
]
Run Code Online (Sandbox Code Playgroud)

其他选项是$('form').serialize(),返回一个字符串:

"foo=1&bar=xxx&this=hi"
Run Code Online (Sandbox Code Playgroud)

看看这个jsfiddle演示

  • 如果返回一个带键值对的对象,`serializeArray`将会非常有用 (86认同)
  • 我同意一个对象是理想的.但是,存在一个问题 - 允许密钥具有多个值.你会返回一个键 - "数组值"对象,或键 - "第一个值"或其他什么?我认为jQuery的家伙没有选择以上:) (6认同)
  • @GetFree 为什么不直接使用 jQuery 地图功能?函数 getFormData(form) { var rawJson = form.serializeArray(); 无功模型 = {}; $.map(rawJson, function (n, i) { model[n['name']] = n['value']; }); 退货模式;} (5认同)
  • 还请注意,为了从任何表单输入记录值,输入必须具有 `name` 属性。 (3认同)
  • 请注意多个值的问题(如上面 @Paul 提到的),复选框和带有 `name="multiple[]"` 的多个输入不起作用。POST方法的解决方案是相同的,只需使用$('form').serialize()。此外,POST 方法不像大多数浏览器中的 GET 那样有 2000 个字符的限制,因此甚至可以用于相当大的数据。 (2认同)

che*_*rtz 411

$('form').serialize() //this produces: "foo=1&bar=xxx&this=hi"
Run Code Online (Sandbox Code Playgroud)

演示

  • Nvm,在serialize()函数的注释中找到它.它叫做serializeArray.它返回一个数组数组(包含一个条目"name"和"value"),但这应该很容易转换. (78认同)
  • 使用下划线库可以使用:`_.object($("#myform").serializeArray().map(function(v){return [v.name,v.value];})) (18认同)
  • 关闭,但也许是返回带键值对而不是单个字符串的数组的东西? (14认同)
  • @BartvanHeukelom我知道这是4年后,但.serializeArray()将返回一个数组. (7认同)
  • 确保每个输入标记都包含name属性,否则它不会返回任何内容. (6认同)
  • 为什么这里的每个JS答案都涉及jQuery (2认同)

mik*_*ana 177

更新了2014年的答案: HTML5 FormData执行此操作

var formData = new FormData(document.querySelector('form'))
Run Code Online (Sandbox Code Playgroud)

然后,您可以完全按原样发布formData - 它包含表单中使用的所有名称和值.

  • 另外一个作为FormData是好的和有用的,但值得注意的是,如果你想读取FormData中的数据,那就不那么容易了(参见http://stackoverflow.com/questions/7752188/formdata-appendkey-value-is-not - 工作) (13认同)
  • @yochannah,不是这样。当然,不能像普通对象那样简单地访问和编辑数据,但是获取数据仍然微不足道。签出`entries()`方法[[MDN页面](https://developer.mozilla.org/en-US/docs/Web/API/FormData/entries)]。 (3认同)

neu*_*ont 163

基于jQuery.serializeArray,返回键值对.

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

  • 这里的键值对,伙计们,各位,来到这里!这是金色的!谢谢!如果我想要一个名为"零售商"的元素的值,我会执行此console.log($('#form').serializeArray().reduce(function(obj,item){obj [item.name] = item. value; return obj;},{})['retailer']); (10认同)
  • 可悲的是,这不适用于多重选择。 (2认同)

Bra*_*rad 68

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
});
Run Code Online (Sandbox Code Playgroud)

这是一个挑剔的答案,但让我解释为什么这是一个更好的解决方案:

  • 我们正在处理表单提交而不是按下按钮.有些人喜欢在田野上进入.有些人使用其他输入设备,如语音输入或其他辅助功能设备.处理表单提交,并为每个人正确解决它.

  • 我们正在深入研究提交的实际表单的表单数据.如果稍后更改表单选择器,则不必更改所有字段的选择器.此外,您可能有多个具有相同输入名称的表单.无需消除过多ID的歧义,也不需要根据提交的表单跟踪输入.如果适合您的情况,这还允许您为多个表单使用单个事件处理程序.

  • FormData界面相当新,但浏览器很好地支持.这是构建数据集合以获得表单中内容的真实值的好方法.没有它,你将不得不循环遍历所有元素(例如with form.elements),并找出所检查的内容,不是什么,值是什么,等等.如果你需要旧的浏览器支持,那么完全可能,但FormData界面更简单.

  • 我在这里使用ES6 ......不是任何要求,所以如果你需要旧的浏览器支持,请将其改回ES5兼容.

  • @Blauhirn胡说八道,他们当然会揭露价值观。我的答案中的代码有效。你应该试试。在这里,我为您准备了一个小提琴:https://jsfiddle.net/zv9s1xq5/如果您想要一个迭代器,请使用`formData.entries()`。 (2认同)

小智 25

使用.serializeArray()以数组格式获取数据,然后将其转换为对象:

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

  • 这不是`someList`应该是`type ="radio"`的情况吗? (2认同)

Clo*_*lox 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;
Run Code Online (Sandbox Code Playgroud)

  • 感谢您给我们一个非jquery答案. (3认同)
  • 这不适用于单选按钮:最后一个选项始终是存储到 `postData` 的选项。 (2认同)

Gui*_* IA 14

最简单的方法,2021。

document.querySelector('form').addEventListener('submit', (e) => {
  const data = Object.fromEntries(new FormData(e.target).entries());
  console.log(data)
});
Run Code Online (Sandbox Code Playgroud)

输出

{ name: 'Stackoverflow' }
Run Code Online (Sandbox Code Playgroud)

  • 是的!在我看来,2021年js仍然不是开发者友好的语言~为什么不直接`e.target.toJson()`呢~ (2认同)

Dus*_*ant 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);
Run Code Online (Sandbox Code Playgroud)

HTML表单

<form id='myform'>
  <input name='myVar1' />
  <input name='myVar2' />
</form>
Run Code Online (Sandbox Code Playgroud)

获取数据

var myData = $("#myForm").getFormData();
Run Code Online (Sandbox Code Playgroud)


pix*_*ine 12

$("#form input, #form select, #form textarea").each(function() {
 data[theFieldName] = theFieldValue;
});
Run Code Online (Sandbox Code Playgroud)

除此之外,你可能想看看serialize() ;

  • $("#form [name]")也可以正常工作 (6认同)

fri*_*ngd 12

现在是2019年,有更好的方法可以做到这一点:

const form = document.querySelector('form');
const data = new URLSearchParams(new FormData(form).entries());
Run Code Online (Sandbox Code Playgroud)

或者如果您想要一个普通对象

const form = document.querySelector('form');
const data = Object.fromEntries(new FormData(form).entries());
Run Code Online (Sandbox Code Playgroud)

尽管请注意,这不适用于重复的键,例如您从具有相同名称的多选和重复复选框中获得。

  • 注意“FormData 将仅使用使用 name 属性的输入字段” - 来自 [MDN](https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects) (5认同)

Kyl*_*ner 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;
}
Run Code Online (Sandbox Code Playgroud)

工作范例:

    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);
    })();
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您正在寻找更完整的实现,那么请查看我为此制作的项目的这一部分.我最终会用我提出的完整解决方案更新这个问题,但也许这会对某人有所帮助.


Rob*_*ohr 9

如果您正在使用jQuery,这里有一个小功能,可以满足您的需求.

首先,在表单中添加一个ID(除非它是页面上唯一的表单,然后你可以使用'form'作为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>
Run Code Online (Sandbox Code Playgroud)

输出看起来像:

{
 "foo": "1",
 "bar": "xxx",
 "this": "hi"
}
Run Code Online (Sandbox Code Playgroud)


num*_*web 6

您还可以使用FormData对象; FormData对象允许您编译一组键/值对以使用XMLHttpRequest发送.它主要用于发送表单数据,但可以独立于表单使用,以便传输密钥数据.

        var formElement = document.getElementById("myform_id");
        var formData = new FormData(formElement);
        console.log(formData);
Run Code Online (Sandbox Code Playgroud)


Tom*_*ugh 6

我提供了答案,还可以返回所需的对象。

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

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

return model;
}
Run Code Online (Sandbox Code Playgroud)


man*_*n94 6

基于神经元的响应,我创建了一个简单的JQuery方法,该方法以键值对的形式获取表单数据,但它适用于多选和name ='example []'的数组输入。

使用方法如下:

var form_data = $("#form").getFormObject();
Run Code Online (Sandbox Code Playgroud)

您可以在下面找到其定义及其工作方式的示例。

var form_data = $("#form").getFormObject();
Run Code Online (Sandbox Code Playgroud)
// 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);
});
Run Code Online (Sandbox Code Playgroud)
/* Only to make view better ;) */
#getObject {
  padding: 10px;
  cursor:pointer;
  background:#0098EE;
  color:white;
  display:inline-block;
}
Run Code Online (Sandbox Code Playgroud)


gam*_*ela 5

这会将所有表单字段附加到JavaScript对象“ res”:

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


Geo*_*ohn 5

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

$.each(params, function(i, val) {
    formData.append(val.name, val.value);
});
Run Code Online (Sandbox Code Playgroud)


GRO*_*ER. 5

对于那些更喜欢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;
    }
};
Run Code Online (Sandbox Code Playgroud)

要执行它,只需使用Form.serialize(form),该函数将返回Object类似于以下内容:

<!-- { username: "username", password: "password" } !-->
<input type="text" value="username">
<input type="password" value="password">
Run Code Online (Sandbox Code Playgroud)

作为奖励,这意味着您不必仅为一个序列化函数安装整个jQuery包。


Lon*_*ran 5

我有点惊讶,因为没有人提到下面的解决方案。

通过 document.forms.namedItem 函数获取表单数据

var form = document.forms.namedItem("fileinfo");

form.addEventListener('submit', function(ev) {
   var oData = new FormData(form);
}
Run Code Online (Sandbox Code Playgroud)

HT

<form name="fileinfo">
  <label>Your email address:</label>
  <input type="email" autocomplete="on" autofocus name="userid" placeholder="email" required size="32" maxlength="64" /><br />
  <label>Custom file label:</label>
  <input type="text" name="filelabel" size="12" maxlength="32" /><br />
  <label>File to stash:</label>
  <input type="file" name="file" required />
  <input type="submit" value="Stash the file!" />
</form>
<div></div>
Run Code Online (Sandbox Code Playgroud)