답변:
$('#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 양식 요청을 모방합니다. 이것은 nickf의 대답이 성취하는 것을 달성하지 못할 것입니다.
.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" );
});
}
이것이 당신에게 어떤 용도로 사용되기를 바랍니다 :)
약간의 비틀기와 비슷한 문제가 있었고 이것을 버릴 것이라고 생각했습니다. 양식을 가져 오는 콜백 함수가 있으므로 양식 객체가 이미 있고 쉽게 변형 할 수 없었습니다 $('form:input')
. 대신에 나는 생각해 냈습니다.
var dataValues = {};
form.find('input').each(
function(unusedIndex, child) {
dataValues[child.name] = child.value;
});
비슷하지만 동일한 상황은 아니지만이 스레드가 매우 유용하다는 것을 알았고 마지막에 이것을 쓰면 다른 사람이 유용하다고 생각했습니다.
연관성? 몇 가지 작업이 없지만 일반 선택기를 사용할 수 있습니다.
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();
});
XMLHttpRequest Level 2 FormData 객체를 사용하여 jQuery 없이도 수행 할 수 있습니다.
http://www.w3.org/TR/2010/WD-XMLHttpRequest2-20100907/#the-formdata-interface
var data = new FormData([form])
아무도 목록 데이터를 얻는 것에 대한 간결한 해결책을 제안하거나 제안하지 않은 것이 이상합니다. 어떤 형태도 단일 치수 객체가 될 수 없습니다.
물론이 솔루션의 단점은 싱글 톤 객체가 [0] 인덱스에서 액세스되어야한다는 것입니다. 그러나 IMO는 수십 라인 매핑 솔루션 중 하나를 사용하는 것보다 낫습니다.
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 와 같은 솔루션 이지만 배열 입력 이름을 고려한 예 :
<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"}
모든 양식 필드를 사용하여 ajax 호출을 수행해야 할 때 : 입력 선택기가 선택 여부에 관계없이 모든 확인란을 반환 하는 데 문제가 있었습니다. 제출 가능한 양식 요소를 얻기 위해 새 선택기를 추가했습니다.
$.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>
그리고 Serialize 기능에서 :
if(!$(name).prop('ignorar')){
do_your_thing;
}
이것이 일부 필드를 무시하는 방식입니다.
$('.mandatory');
그리고!$('.mandatory');
ignore_this
에 data-ignore-this="true"
대신 유효성 검사 W3C를하지 않는 자신의 속성 작성
여러 선택 요소 ( <select multiple="multiple">
)의 경우 @Jason Norwood-Young에서 솔루션을 수정하여 작동 시켰습니다.
답 (같은 배치는)뿐만 아니라 선택한 첫 번째 요소의 값 소요 그들 모두를 . 또한 data
자바 스크립트 오류가 발생하여 초기화하거나 반환하지 않았습니다 .
새 버전은 다음과 같습니다.
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>