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)
che*_*rtz 411
$('form').serialize() //this produces: "foo=1&bar=xxx&this=hi"
Run Code Online (Sandbox Code Playgroud)
mik*_*ana 177
更新了2014年的答案: HTML5 FormData执行此操作
var formData = new FormData(document.querySelector('form'))
Run Code Online (Sandbox Code Playgroud)
然后,您可以完全按原样发布formData - 它包含表单中使用的所有名称和值.
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)
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兼容.
小智 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)
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)
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)
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() ;
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)
尽管请注意,这不适用于重复的键,例如您从具有相同名称的多选和重复复选框中获得。
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)
如果您正在寻找更完整的实现,那么请查看我为此制作的项目的这一部分.我最终会用我提出的完整解决方案更新这个问题,但也许这会对某人有所帮助.
如果您正在使用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)
您还可以使用FormData对象; FormData对象允许您编译一组键/值对以使用XMLHttpRequest发送.它主要用于发送表单数据,但可以独立于表单使用,以便传输密钥数据.
var formElement = document.getElementById("myform_id");
var formData = new FormData(formElement);
console.log(formData);
Run Code Online (Sandbox Code Playgroud)
我提供了答案,还可以返回所需的对象。
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)
基于神经元的响应,我创建了一个简单的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)
这会将所有表单字段附加到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)
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)
对于那些更喜欢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包。
我有点惊讶,因为没有人提到下面的解决方案。
通过 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)