JavaScript / jQuery로 양식 데이터를 얻으려면 어떻게해야합니까?


404

고전적인 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>

산출:

{
    "foo": "1",
    "bar": "xxx",
    "this": "hi"
}

텍스트 영역, 선택, 라디오 버튼 및 확인란이 (올바르게) 포함되어 있지 않기 때문에 이와 같은 것은 너무 간단합니다.

$("#form input").each(function () {
    data[theFieldName] = theFieldValue;
});

3
이와 비슷한 또 다른 질문 : stackoverflow.com/questions/169506/…
Marcelo Rodovalho

답변:


431
$('form').serialize() //this produces: "foo=1&bar=xxx&this=hi"

데모


15
닫히지 만 아마도 단일 문자열 대신 키-값 쌍을 가진 배열을 반환하는 것입니까?
Bart van Heukelom

80
Nvm, serialize () 함수의 주석에서 찾았습니다. 이를 serializeArray라고합니다. "name"과 "value"항목을 포함하는 배열의 배열을 반환하지만 변환하기에 충분히 쉬워야합니다.
Bart van Heukelom

22
밑줄 라이브러리를 사용하여 다음을 사용하여 변환 할 수 있습니다._.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))
MhdSyrwan

8
@BartvanHeukelom 이것이 4 년 후인 것을 알고 있지만 .serializeArray ()는 배열을 반환합니다.
TJ WealthEngine API Evangelist

6
모든 입력 태그에 name 속성이 포함되어 있는지 확인하십시오. 그렇지 않으면 아무 것도 반환하지 않습니다.
Eugene Kulabuhov

505

배열$('form').serializeArray() 을 반환하는 Use :

[
  {"name":"foo","value":"1"},
  {"name":"bar","value":"xxx"},
  {"name":"this","value":"hi"}
]

다른 옵션은 $('form').serialize()이며 문자열 을 반환 합니다 .

"foo=1&bar=xxx&this=hi"

이 jsfiddle 데모를 살펴보십시오


91
serializeArray키-값 쌍을 가진 객체를 반환하면 훨씬 더 유용합니다
GetFree

8
나는 물체가 이상적이라는 데 동의합니다. 그러나 키가 여러 값을 가질 수있는 문제가 있습니다. 키 "값 배열"객체 또는 키 "첫 번째 값"또는 다른 것을 반환 하시겠습니까? 나는 jQuery 사람들이 위의 어느 것도 선택하지 않았다고 생각한다 :)
Paul

@Paul이 위에서 언급 한 것처럼 여러 값에 대한 문제를 알고 확인란과 여러 입력이 name="multiple[]"작동하지 않습니다. POST 메소드의 솔루션은 동일합니다. $ ( 'form'). serialize ()를 사용하십시오. 또한 POST 방법은 대부분의 브라우저에서 GET과 같이 2000 자로 제한되지 않으므로 아주 큰 데이터에도 사용할 수 있습니다.
Artru

또한 모든 양식 입력에서 값을 기록하려면 입력에 name속성이 있어야 합니다.
Chris-Jr

@GetFree 왜 jQuery 맵 함수를 사용하지 않습니까? 함수 getFormData (form) {var rawJson = form.serializeArray (); var model = {}; $ .map (rawJson, 함수 (n, i) {model [n [ 'name']] = n [ 'value'];}); 모델 반환; }
Tom McDonough

196

2014 년 업데이트 된 답변 : HTML5 FormData 가이를 수행

var formData = new FormData(document.querySelector('form'))

그런 다음 formData를 그대로 게시 할 수 있습니다. 여기에는 양식에 사용 된 모든 이름과 값이 포함됩니다.


13
또한 하나는 FormData로서 유용하고 유용하지만 FormData 내부의 데이터를 읽으려면 그렇게 쉽지 않다는 점에 주목할 가치가 있습니다 ( stackoverflow.com/questions/7752188/… 참조 )
StackExchange What The Heck

1
FormData는 XMLHttpRequest 고급 기능 (이전의 XMLHttpRequest 레벨 2)의 일부이므로 Internet Explorer <10 에 대한 폴리 필 을 사용해야합니다 . caniuse.com/#feat=xhr2
Pier-Luc

3
@yochannah, 그렇지 않습니다. 물론 일반 객체처럼 데이터에 액세스하고 편집 할 수는 없지만 데이터를 얻는 것은 여전히 ​​쉽지 않습니다. [MDN 페이지 ] entries()방법을 확인하십시오 .
웹 및 흐름

@Web과 Flow가 이것을 지적 해 주셔서 감사합니다! 브라우저가 새롭고 유용한 기능을 추가 할 때 좋아합니다 :) 시간, 그들은 변하고 있습니다.
StackExchange 무엇 도대체

Flask-python 스크립트에 객체를 보내기 위해 FormData를 사용하려고하는데 풀 수있는 일반적인 요청 객체로 나오지 않는 것 같습니다. 누군가 서버 측에서 처리하는 특별한 단계에 대한 설명을 가리킬 수 있습니까? 그게 나에게 비어있는 곳입니다.
manisha

180

에 따라 jQuery.serializeArray키-값 쌍을 반환합니다.

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

11
여기 키-값 쌍이 있습니다. 여러분 모두 여기옵니다! 황금이다 !!! 감사! "retailer"라는 요소의 값을 원하면이 console.log ($ ( '# form'). serializeArray (). reduce (function (obj, item) {obj [item.name] = item입니다. 값; return obj;}, {}) [ '소매점']);
예브게니 Afanasyev

어제이 답변을 기반으로 JQuery 메소드를 만들었지 만 다중 선택 및 입력 배열 (예 : 'example []')로 작업했습니다. 아래 내 답변에서 찾을 수 있습니다. 어쨌든, 좋은 접근 방식의 뉴런, 감사합니다! :)
manuman94

이것은 모든 답변 중에서 가장 적합했습니다!
VPetrovic 19

이 IMHO가 최고의 답변입니다!
Rahul

74
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
});

이것은 별난 대답이지만 이것이 왜 더 나은 해결책인지 설명하겠습니다.

  • 우리는 버튼 누르기보다는 양식 제출을 올바르게 처리하고 있습니다. 어떤 사람들은 들판에 들어가기를 좋아합니다. 어떤 사람들은 음성 입력 또는 기타 접근성 장치와 같은 대체 입력 장치를 사용합니다. 양식 제출을 처리하면 모든 사람이 올바르게 해결할 수 있습니다.

  • 제출 된 실제 양식에 대한 양식 데이터를 파고 있습니다. 나중에 양식 선택기를 변경하면 모든 필드의 선택기를 변경할 필요가 없습니다. 또한 입력 이름이 동일한 여러 양식이있을 수 있습니다. 과도한 ID로 명확히 할 필요가 없으며 제출 된 양식을 기반으로 입력을 추적하기 만하면됩니다. 또한 상황에 적합한 경우 여러 양식에 단일 이벤트 핸들러를 사용할 수 있습니다.

  • FormData 인터페이스는 상당히 새롭지 만 브라우저에서 잘 지원됩니다. 양식에있는 것의 실제 값을 얻기 위해 해당 데이터 콜렉션을 빌드하는 좋은 방법입니다. 그것 없이는 (와 같은) 모든 요소를 ​​반복 form.elements하고 확인 된 것, 확인되지 않은 것, 값 등을 알아 내야합니다. 오래된 브라우저 지원이 필요하다면 완전히 가능하지만 FormData 인터페이스가 더 간단합니다.

  • ES6을 사용하고 있습니다 ... 어떤 요구 사항도 없으므로 이전 브라우저 지원이 필요한 경우 ES5와 호환되도록 다시 변경하십시오.


참고로 FormData 객체는 해당 값을 노출하지 않습니다. 그것으로부터 일반 객체를 얻으려면 stackoverflow.com/questions/41431322/…
phil294

2
@Blauhirn Nonsense는 물론 값을 노출합니다. 내 답변의 코드가 작동합니다. 당신은 그것을 시도해야합니다. 여기, 나는 당신을 위해 바이올린을 만들었습니다 : jsfiddle.net/zv9s1xq5 반복자를 원한다면을 사용하십시오 formData.entries().
브래드

작동한다는 것을 알고 있지만 키로 속성에 액세스 할 수 없습니다. 예를 들어, formData.foo 정의되지 않았습니다. 당신의 대답에서 볼 수 있듯이, .get() 불편하다고 생각되는 것을 불러야합니다. 어쩌면 "노출하지 않는다"는 잘못된 길을 따라 왔을 것이다. 따라서 이벤트 { foo: 'bar' }에서 무언가를 생성 submit하려면 수동으로 반복해야합니다. 따라서 . To get a plain object from it, see [link].
phil294

1
@Blauhirn 당신은 그것에 대해 잘못입니다. XMLHttpRequest는 FormData를 직접 지원합니다. xhr.send(formData);
브래드

1
@Blauhirn JSON.stringify([...formData]) 또는 키 / 값을 분리하려면 ... [...formData].reduce((prev, cur) => { prev[cur[0]] = cur[1]; return prev;}, {})
Brad

25

.serializeArray ()를 사용하여 데이터를 배열 형식으로 가져온 다음 객체로 변환하십시오.

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

와 같은 것이 있으면 내 확인란을 덮어 씁니다 <input type="checkbox" name="someList" value="one" /> <input type="checkbox" name="someList" value="two" />. 둘 다 선택하면 개체에 두 번째 확인란 값만 포함됩니다.
dmathisen

2
이 경우 someListtype="radio"아닌가?
dylanjameswagner

허용 대답은 같은 키를 사용하여 객체를 반환하지 않기 때문에 upvote에 :name:value
매트 - 더 - 마르크스주의

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;

1
라디오 버튼에서는 작동하지 않습니다. 마지막 옵션은 항상에 저장된 옵션입니다 postData.
Kyle Falconer

3
jquery 이외의 답변을 제공해 주셔서 감사합니다.
글렌 피어스

23

2019 년이며이를 수행하는 더 좋은 방법이 있습니다.

const form = document.querySelector('form');
const data = new URLSearchParams(new FormData(form).entries());

또는 대신 일반 객체를 원할 경우

const form = document.querySelector('form');
const data = Object.fromEntries(new FormData(form).entries());

동일한 이름의 다중 선택 및 복제 확인란에서와 같이 중복 키에서는 작동하지 않습니다.


전적으로. 비록 모두 같은 이름을 가진 입력 목록을위한 배열을 얻지 못했지만 document.getElementsByClassNamefor 루프 를 사용 하지만 jQuery 등을 요구하는 것보다 여전히 좋습니다
alphanumeric0101

1
이 대답은 내가 가장 좋아하는 것입니다. 그러나 document.querySelector그냥 읽어야 합니다 querySelector.
adabru

참고 "FormData는 이름 속성을 사용하는 입력 필드 만 사용합니다"– MDN
binaryfunt


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);

HTML 양식

<form id='myform'>
  <input name='myVar1' />
  <input name='myVar2' />
</form>

데이터 입수

var myData = $("#myForm").getFormData();

이 플러그인은 이름이 같은 여러 양식 입력 항목이있는 경우 작동하지 않습니다. 마지막 항목은 이전 항목을 대체하지만 예상되는 동작은 모든 값을 다음과 같이 얻는 것입니다.Array
Milli

1
1 년 후 나는 이것이 끔찍한 대답이라고 생각하며 아무도 그것을 사용해서는 안됩니다. 이전 의견에서 알 수 있듯이 라디오 버튼과 같은 것은 작동하지 않습니다. 위에 더 나은 답변이 있습니다. 대신 그중 하나를 사용하십시오.
더스틴 포 아상 September

12
$("#form input, #form select, #form textarea").each(function() {
 data[theFieldName] = theFieldValue;
});

그 외에는 serialize () 를보고 싶을 수도 있습니다 .


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;
}

작업 예 :

    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);
    })();
<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>

편집하다:

더 완벽한 구현을 찾고 있다면 내가 만든 프로젝트 의이 섹션을 살펴보십시오 . 나는 결국 내가 생각해 낸 완전한 솔루션 으로이 질문을 업데이트 할 것입니다. 그러나 이것은 누군가에게 도움이 될 것입니다.


1
좋은 해결책 :) setOrPush 함수를 사용하여 하나의 버그를 발견했습니다. 대상이 이미 배열인지 확인하는 검사가 포함되어 있지 않으므로 동일한 이름을 가진 여러 개의 확인란이 선택된 경우 깊은 중첩 배열이 생성됩니다.
Wouter van Dam

트윗 담아 가기 라디오와 확인란의 스위치 케이스를 병합하지 않은 이유는 올바르게 작동하는 것입니다.
Ethan

@Ethan 확인란은 여러 값을 선택할 수 있고 라디오는 하나의 값만 선택할 수 있기 때문에 값을 저장하는 방식이 변경됩니다.
Kyle Falconer

@KyleFalconer 네, 이해합니다. '체크 박스'처리를위한 코드는 또한 'SetOrPush'루틴으로 인해 '라디오'에 대해 가능한 단일 선택을 처리합니다.
Ethan

@Ethan Oh 당신이 무슨 말을하는지 알 것 같아요. 어느 쪽이든 할 수 있지만 값 배열이 아닌 하나의 값만 원했기 때문에이 방법을 사용했다고 생각합니다.
Kyle Falconer

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>

결과는 다음과 같습니다.

{
 "foo": "1",
 "bar": "xxx",
 "this": "hi"
}

7

FormData 객체를 사용할 수도 있습니다 . FormData 객체를 사용하면 XMLHttpRequest를 사용하여 전송할 키 / 값 쌍 세트를 컴파일 할 수 있습니다. 주로 양식 데이터를 전송하는 데 사용되지만 키 데이터를 전송하기 위해 양식과 독립적으로 사용할 수 있습니다.

        var formElement = document.getElementById("myform_id");
        var formData = new FormData(formElement);
        console.log(formData);

고맙지 만 ID가 없으면 어떻게해야합니까? JQuery 객체로 양식이있는 경우 어떻게해야합니까? var form = $ (this) .closest ( 'form'); ? var formElement = document.getElementById (form [0]); 대신 전나무 라인을 사용 하시겠습니까? 불행히도 작동하지 않습니다. 왜 그런지 아십니까?
Yevgeniy Afanasyev 1

실제로 FormData가 모든 브라우저에서 지원되는 것은 아닙니다. (따라서 다른 접근 방식을 사용하는 것이 좋습니다
numediaweb

감사. 최신 크롬을 사용했지만 여전히 작동하지 않았습니다. 그래서 나는 #neuront 답변과 함께 갔다.
Yevgeniy Afanasyev

6

그러면 모든 양식 필드가 JavaScript 객체 "res"에 추가됩니다.

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

아마도이 똑같은 대답이 2010 년에 이미 게시 되었기 때문일 것입니다.
nathanvda

나는 몰랐다. 그러한 짧은 대답에 대해서는 놀라운 일이 아닙니다. 그럼에도 불구하고 참조는 어디에 있습니까?
gamliela

진심이야? 당신은 참조가없는 내 의견을 믿지 않으며 답이 동일한 지 확인하기 위해 답변 목록을 볼 수조차 없습니까? stackoverflow.com/a/2276469/216513
nathanvda 2013 년

나는 당신이 다른 질문에 대한 답을 의미한다고 생각했습니다. 나는 지금 세부 사항과 나의 이유를 기억하지 못한다. 아마 정확히 같지 않기 때문에
gamliela

1
입력을 위해 일하기를 원하는 사람에게 완벽한 대답, 다중 및 텍스트 영역을 선택하십시오. serialize를 사용하면 select 태그에서 선택된 모든 항목을 얻지 못합니다. 그러나 .val ()을 사용하면 원하는 배열을 정확히 얻을 수 있습니다. 간단하고 직접적인 답변.
Sailesh Kotha

6

나는 필요한 물건을 돌려주는 대답을 포함시켰다.

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

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

return model;
}

이것은 배열을 전혀 처리하지 않습니다. foo[bar][] = 'qux'로 직렬화해야합니다 { foo: { bar: [ 'qux' ] } }.
amphetamachine

6

neuront의 응답을 기반으로 키-값 쌍으로 양식 데이터를 가져 오는 간단한 JQuery 메소드를 만들었지 만 다중 선택 및 name = 'example []'의 배열 입력에 작동합니다.

이것이 사용되는 방법입니다.

var form_data = $("#form").getFormObject();

아래 정의와 작동 방식에 대한 예를 찾을 수 있습니다.

// 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);
});
/* Only to make view better ;) */
#getObject {
  padding: 10px;
  cursor:pointer;
  background:#0098EE;
  color:white;
  display:inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<form id="form">
  <input type="text" name="text" value="Hola amigo" /> 
  
  <input type="text" name="text_array[]" value="Array 1" /> 
  <input type="text" name="text_array[]" value="Array 2" /> 
  <input type="text" name="text_array[]" value="Array 3" /> 
  
  <select name="multiselect" multiple>
    <option name="option1" selected> option 1 </option>
    <option name="option2" selected> option 2 </option>
  </select>
  
  <input type="checkbox" name="checkbox" value="checkbox1" checked/>
  <input type="checkbox" name="checkbox" value="checkbox2" checked/>
  
  <input type="radio" name="radio" value="radio1" checked/>
  <input type="radio" name="radio" value="radio2"/>

</form>

<div id="getObject"> Get object (check the console!) </div>


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

$.each(params, function(i, val) {
    formData.append(val.name, val.value);
});

4
function getFormData($form){
    var unindexed_array = $form.serializeArray();
    var indexed_array = {};

    $.map(unindexed_array, function(n, i){
        if(indexed_array[n['name']] == undefined){
            indexed_array[n['name']] = [n['value']];
        }else{
            indexed_array[n['name']].push(n['value']);
        }
    });

    return indexed_array;
}

4

이 함수 를 사용 하여 양식의 오브젝트 또는 JSON을 가질 수 있습니다 .

그것을 사용하십시오 :

var object = formService.getObjectFormFields("#idform");

 function  getObjectFormFields(formSelector)
        {
            /// <summary>Função que retorna objeto com base nas propriedades name dos elementos do formulário.</summary>
            /// <param name="formSelector" type="String">Seletor do formulário</param>

            var form = $(formSelector);

            var result = {};
            var arrayAuxiliar = [];
            form.find(":input:text").each(function (index, element)
            {
                var name = $(element).attr('name');

                var value = $(element).val();
                result[name] = value;
            });

            form.find(":input[type=hidden]").each(function (index, element)
            {
                var name = $(element).attr('name');
                var value = $(element).val();
                result[name] = value;
            });


            form.find(":input:checked").each(function (index, element)
            {
                var name;
                var value;
                if ($(this).attr("type") == "radio")
                {
                    name = $(element).attr('name');
                    value = $(element).val();
                    result[name] = value;
                }
                else if ($(this).attr("type") == "checkbox")
                {
                    name = $(element).attr('name');
                    value = $(element).val();
                    if (result[name])
                    {
                        if (Array.isArray(result[name]))
                        {
                            result[name].push(value);
                        } else
                        {
                            var aux = result[name];
                            result[name] = [];
                            result[name].push(aux);
                            result[name].push(value);
                        }

                    } else
                    {
                        result[name] = [];
                        result[name].push(value);
                    }
                }

            });

            form.find("select option:selected").each(function (index, element)
            {
                var name = $(element).parent().attr('name');
                var value = $(element).val();
                result[name] = value;

            });

            arrayAuxiliar = [];
            form.find("checkbox:checked").each(function (index, element)
            {
                var name = $(element).attr('name');
                var value = $(element).val();
                result[name] = arrayAuxiliar.push(value);
            });

            form.find("textarea").each(function (index, element)
            {
                var name = $(element).attr('name');
                var value = $(element).val();
                result[name] = value;
            });

            return result;
        }


2
이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다. - 리뷰에서
Wahyu Kristianto

그러나이 링크에는 그의 도움을주는 기능이 있습니다. 그러나 다음에 코드를 넣을 것입니다.
Marcos Costa

3

이 문제를 해결하기 위해 라이브러리를 작성했습니다 .JSONForms . 형식을 취하고 각 입력을 거치며 쉽게 읽을 수있는 JSON 객체를 만듭니다.

다음과 같은 양식이 있다고 가정하십시오.

<form enctype='application/json'>
  <input name='places[0][city]' value='New York City'>
  <input type='number' name='places[0][population]' value='8175133'>
  <input name='places[1][city]' value='Los Angeles'>
  <input type='number' name='places[1][population]' value='3792621'>
  <input name='places[2][city]' value='Chicago'>
  <input type='number' name='places[2][population]' value='2695598'>
</form>

양식을 JSONForms의 encode 메소드에 전달하면 다음 오브젝트가 리턴됩니다.

{
  "places": [
    {
      "city": "New York City",
      "population": 8175133
    },
    {
      "city": "Los Angeles",
      "population": 3792621
    },
    {
      "city": "Chicago",
      "population": 2695598
    }
  ]
}

다음 은 귀하의 양식에 대한 데모 입니다.


감사합니다. 축소 된 버전에서 맵 파일을 호출하는 것은 선택적 imo 여야합니다.
adi518

2

$( "form" ).bind( "submit", function(e) {
    e.preventDefault();
    
    console.log(  $(this).serializeObject() );    

    //console.log(  $(this).serialize() );
    //console.log(  $(this).serializeArray() );

});


$.fn.serializeObject = function() {
    var o = {};
    var a = this.serializeArray();

    $.each( a, function() {
        if ( o[this.name] !== undefined) 
        {
            if ( ! o[this.name].push ) 
            {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        }
        else 
        {
            o[this.name] = this.value || '';
        }
    });

    return o;
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<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>
    </select>

    <input type="submit" value="Submit" />

</form>

코드 펜


2

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;
    }
};

그것을 실행하려면 그냥 사용 Form.serialize(form)하면 함수는 다음 Object과 비슷한 것을 반환합니다 .

<!-- { username: "username", password: "password" } !-->
<input type="text" value="username">
<input type="password" value="password">

보너스로, 하나의 직렬화 기능을 위해 전체 jQuery 번들을 설치할 필요가 없습니다 .


1

여러 개의 확인란과 여러 개의 선택을 처리하는 기능을 작성했습니다. 이 경우 배열을 반환합니다.

function getFormData(formId) {
    return $('#' + formId).serializeArray().reduce(function (obj, item) {
        var name = item.name,
            value = item.value;

        if (obj.hasOwnProperty(name)) {
            if (typeof obj[name] == "string") {
                obj[name] = [obj[name]];
                obj[name].push(value);
            } else {
                obj[name].push(value);
            }
        } else {
            obj[name] = value;
        }
        return obj;
    }, {});
}

1

페이지 새로 고침없이 양식을 제출하고 여기에 파일 포함으로 모든 값을 가져 오기 위해 양식 입력 요소 필드 및 입력 파일을 표시합니다.

<form id="imageUploadForm"   action="" method="post" enctype="multipart/form-data">
<input type="text" class="form-control" id="fname" name='fname' placeholder="First Name" >
<input type="text" class="form-control" name='lname' id="lname" placeholder="Last Name">
<input type="number" name='phoneno'  class="form-control" id="phoneno" placeholder="Phone Number">
<textarea class="form-control" name='address' id="address" rows="5" cols="5" placeholder="Your Address"></textarea>
<input type="file" name="file" id="file" >
<input type="submit" id="sub" value="Registration">					   
</form>
제출 버튼 페이지에서 PHP 파일로 아약스 요청을 보냅니다.
$('#imageUploadForm').on('submit',(function(e) 
{
     fname = $('#fname').val();
     lname =  $('#lname').val();
     address =  $('#address').val();
     phoneno =  $('#phoneno').val();
     file =  $('#file').val();
     e.preventDefault();
     var formData = new FormData(this);
     formData.append('file', $('#file')[0]);
     formData.append('fname',$('#fname').val());
     formData.append('lname',$('#lname').val());
     formData.append('phoneno',$('#phoneno').val());
     formData.append('address',$('#address').val());
     $.ajax({
		type:'POST',
                url: "test.php",
                //url: '<?php echo base_url().'edit_profile/edit_profile2';?>',

                data:formData,
                cache:false,
                contentType: false,
                processData: false,
                success:function(data)
                {
                     alert('Data with file are submitted !');

                }

     });

}))


여기에 새로운 FormData가 필요합니까?
Sahu V Kumar

1
@VishalKumarSahu 파일을 업로드하고 있으므로 formData를 사용합니다.
Mohsin Shoukat

1
$(form).serializeArray().reduce(function (obj, item) {
      if (obj[item.name]) {
           if ($.isArray(obj[item.name])) {
               obj[item.name].push(item.value);
           } else {
                var previousValue = obj[item.name];
                obj[item.name] = [previousValue, item.value];
           }
      } else {
           obj[item.name] = item.value;
      }

     return obj;
}, {});

다중 선택에서 작동하지 않는 문제를 해결합니다.


0

당신은 모두 완전히 정확하지 않습니다. 당신은 쓸 수 없습니다 :

formObj[input.name] = input.value;

이 방법으로 다중 선택 목록이있는 경우 "param1": "value1", "param1": "value2"로 전송되므로 마지막 값으로 값을 덮어 씁니다.

따라서 올바른 접근 방식은 다음과 같습니다.

if (formData[input.name] === undefined) {
    formData[input.name] = input.value;
}
else {
    var inputFieldArray = $.merge([], $.isArray(formData[input.name]) ? formData[input.name] : [formData[input.name]]);
    $.merge(inputFieldArray, [input.value]);
    formData[input.name] = $.merge([], inputFieldArray);
}

0

이 방법으로해야합니다. 양식 데이터를 직렬화 한 다음 객체로 변환합니다. 확인란 그룹도 관리합니다.

function getFormObj(formId) {
  var formParams = {};
  $('#' + formId)
    .serializeArray()
    .forEach(function(item) {
      if (formParams[item.name]) {
        formParams[item.name] = [formParams[item.name]];
        formParams[item.name].push(item.value)
      } else {
        formParams[item.name] = item.value
      }
    });
  return formParams;
}

컨트롤이 name속성을 공유하는 라디오 버튼에는 적용되지 않지만 확인란에는 작동 합니다.
Kyle Falconer

0

다음은 양식 데이터를 객체로 추출하기 위해 작성한 멋진 바닐라 JS 함수입니다. 또한 객체에 추가를 삽입하고 양식 입력 필드를 지우는 옵션도 있습니다.

const extractFormData = ({ form, clear, add }) => {
  return [].slice.call(form.children).filter(node => node.nodeName === 'INPUT')
  .reduce((formData, input) => {
    const value = input.value
    if (clear) { input.value = '' }
    return {
      ...formData,
      [input.name]: value
    }
  }, add)
}

다음은 게시 요청과 함께 사용하는 예입니다.

submitGrudge(e) {
  e.preventDefault()

  const form = e.target
  const add = { id: Date.now(), forgiven: false }
  const grudge = extractFormData({ form, add, clear: true })

  // grudge = {
  //  "name": "Example name",
  //  "offense": "Example string",
  //  "date": "2017-02-16",
  //  "id": 1487877281983,
  //  "forgiven": false
  // }

  fetch('http://localhost:3001/api/grudge', {
    method: 'post',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(grudge)
  })
    .then(response => response.json())
    .then(grudges => this.setState({ grudges }))
    .catch(err => console.log('error: ', err))
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.