jQuery создает объект из полей формы
Как создать объект с полями и значениями формы?
вот так:
{
fields:
{
name: 'foo',
email: 'foo@moo.com',
comment: 'wqeqwtwqtqwtqwet'
}
}
предполагая, что форма выглядит так:
<form>
<input type="text" name="name" value="foo" />
<input type="text" name="email" value="foo@moo.com" />
<textarea name="comment">wqeqwtwqtqwtqwet</textarea>
</form>
мне нужно знать, как я могу это сделать для любой формы с одной функцией, а не только для конкретной формы.
9 ответов
вы можете сделать это:
var fields = {};
$("#theForm").find(":input").each(function() {
// The selector will match buttons; if you want to filter
// them out, check `this.tagName` and `this.type`; see
// below
fields[this.name] = $(this).val();
});
var obj = {fields: fields}; // You said you wanted an object with a `fields` property, so...
остерегайтесь, что формы могут иметь поля с повторяющимися именами, и то, что вы пытаетесь сделать, не поддерживаю. Кроме того,ордер полей в HTML-формах может быть значительным. (Это обе причины того, что serializeArray
работает так, как это делает.)
обратите внимание, что обычная практика HTML-это опустить отключенные поля. Если вы хотите это сделать, проверьте this.disabled
перед тем как взять значение что ж.
обратите внимание, что выше (написано два года назад) использует псевдо-селектор jQuery. Я немного удивлен, что написал это. Как говорится в документация :input
псевдо-селектор, используя его, означает, что jQuery не может передать селектор родномуquerySelectorAll
(который теперь есть почти во всех браузерах).
в наши дни я бы, наверное, написал:
$("#theForm").find("input, textarea, select, button")...
...если я хотел пуговицы, или если нет тогда
$("#theForm").find("input, textarea, select")...
...а затем отфильтровать input[type="button"]
и input[type="submit"]
внутри each
. Например. (никаких кнопок):
$("#theForm").find("input, textarea, select").each(function() {
var inputType = this.tagName.toUpperCase() === "INPUT" && this.type.toUpperCase();
if (inputType !== "BUTTON" && inputType !== "SUBMIT") {
// ...include it, either it's an `input` with a different `type`
// or it's a `textarea` or a `select`...
}
});
var inputs = $("form :input");
var obj = $.map(inputs, function(x, y) {
return {
Key: x.name,
Value: $(x).val()
};
});
console.log(obj);
согласно комментарию к http://api.jquery.com/serializeArray/ Страница, вы можете сделать:
(function( $ ){
$.fn.serializeJSON=function() {
var json = {};
jQuery.map($(this).serializeArray(), function(n, i){
json[n['name']] = n['value'];
});
return json;
};
})( jQuery );
затем выполните:
var obj = $('form').serializeJSON();
или, если вам это нужно с вашим fields
свойства, вы можете изменить функцию или сделать этого:
var obj = {fields: $('form').serializeJSON()};
или вы можете просто использовать serializeArray()
если вы не возражаете против этого формата вывода.
jQuery имеет сериализовать() функция на froms как $('#myform').serialize ()
Это то, что вы ищете?
обновление: oops, возможно, попробуйте serializeArray () вместо этого, он должен дать вам массив имени и значения.
function formsToObj(){
var forms = [];
$('form').each(function(i){
forms[i] = {};
$(this).children('input,textarea,select').each(function(){
forms[i][$(this).attr('name')] = $(this).val();
});
});
return forms;
}
это обобщенная функция, которая создает объект для каждого форму на странице
таким образом, вы поймаете все значения из нескольких вариантов или групп флажков
function form2obj(form) {
var arr = $(form).serializeArray(), obj = {};
for(var i = 0; i < arr.length; i++) {
if(obj[arr[i].name] === undefined) {
obj[arr[i].name] = arr[i].value;
} else {
if(!(obj[arr[i].name] instanceof Array)) {
obj[arr[i].name] = [obj[arr[i].name]];
}
obj[arr[i].name].push(arr[i].value);
}
}
return obj;
};
поэтому я всегда стараюсь поместить обертку среди формы.
это особенно важно для отправки формы, которые работают над ajax.
первое, что нужно сделать, это захватить форму на submit.
$(".ajax-form").submit(function(){
var formObject = objectifyForm($(this).serializeArray());
// Do stuff with formObject
// always add return false to stop the form from actually doing a post anywhere
return false;
});
это обернет любую форму, которая имеет класс "ajax-form" и отправит serializeArray в функцию, которая называется objectify form, которая вернет объект всех значений этой формы.
function objectifyForm(formArray) {
returnArray = {};
for (var i = 0; i < formArray.length; i++) {
returnArray[formArray[i]['name']] = formArray[i]['value'];
}
return returnArray;
}
простой код формы
<form id="myForm" name="myForm">
<input type="text" name="email" value="fazelman@test.com"/>
<input type="checkbox" name="gender">
<input type="password" name="pass" value="123"/>
<textarea name="message">Enter Your Message Her</textarea>
</form>
Код Javascript:
var data = {};
var element = document.getElementById("form").elements
for (var i = 0; i < element.length; i++) {
switch (element[i].type) {
case "text": data[element[i].name] = element[i].value; break;
case "checkbox": data[element[i].name] = element[i].checked; break;
case "password": data[element[i].name] = element[i].checked; break;
case "textarea": data[element[i].name] = element[i].value; break;
}
}