Answers:
$('#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表单输入serializeArray
在jQuery 1.3版中不起作用。适用于1.4+版本
name
和的对象的数组value
。更好的解决方案可能是将serializeArray的输出处理为所需的任何格式。
<select>
元素呢?我试过了,var $inputs = $('#new-ticket :input, :select');
但是不行。有谁知道这样做的正确方法,因为我认为我做的不正确。
$("#new-ticket :input, #new-ticket :select")
,甚至更好,$(":input, :select", "#new-ticket")
在这个问题上晚了聚会,但是这甚至更容易:
$('#myForm').submit(function() {
// Get all the forms elements and their values in one step
var values = $(this).serialize();
});
.serialize()
(api.jquery.com/serialize)将表单的所有元素放在单个字符串中,准备添加到查询字符串中的URL,本质上是模仿GET表单请求。这将无法完成尼克的答案。
.serialize()
仅适用于表单元素。因此$('form select').serialize()
将序列化的数据仅用于选择。
$('#myForm')
使用$(this)。
该jquery.form插件可以帮助别人正在寻找结束了在这个问题上。我不确定它是否直接满足您的要求。
也有serializeArray函数。
有时,我发现一次获得一个更有用。为此,这是:
var input_name = "firstname";
var input = $("#form_id :input[name='"+input_name+"']");
[0].value
于此即$(...)[0].value;
直接给了我输入值,谢谢!
这是另一种解决方案,通过这种方式,您可以获取有关表单的所有数据,并将其用于服务器端调用或其他操作中。
$('.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" );
});
}
希望这对你们任何人都有用:)
关联的?不是没有一些工作,但是您可以使用通用选择器:
var items = new Array();
$('#form_id:input').each(function (el) {
items[el.name] = el;
});
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])
此代码段将 代替名称,电子邮件输入您的表单字段名称
$(document).ready(function(){
$("#form_id").submit(function(event){
event.preventDefault();
var name = $("input[name='name']",this).val();
var email = $("input[name='email']",this).val();
});
});
与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();
}
});
如果您需要从输入中获取多个值,并且使用[]来定义具有多个值的输入,则可以使用以下方法:
$('#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;
}
}
});
受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"}
我希望这是最有用的,也是最简单的一种。
$("#form").submit(function (e) {
e.preventDefault();
input_values = $(this).serializeArray();
});
当我需要使用所有表单字段进行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网站上的产品选项时,包括复选框和文本字段以及标准选择框类型时,我使用了此选项。
希望这对某人有帮助。:)
// 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;
};
所有答案都是好的,但是在该函数中是否有您要忽略的字段?轻松,给字段一个属性,例如ignore_this:
<input type="text" name="some_name" ignore_this>
并在您的序列化功能中:
if(!$(name).prop('ignorar')){
do_your_thing;
}
这就是您忽略某些字段的方式。
$('.mandatory');
和!$('.mandatory');
ignore_this
为data-ignore-this="true"
而不是创建您自己的不验证w3c的属性
尝试以下代码:
jQuery("#form").serializeArray().filter(obje =>
obje.value!='').map(aobj=>aobj.name+"="+aobj.value).join("&")
对于多个选择元素(<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>