Hoe kan ik formuliergegevens krijgen met JavaScript/jQuery?

Is er een eenvoudige, éénregelige manier om de gegevens van een formulier te krijgen zoals het zou zijn als het op de klassieke manier zou worden ingediend, alleen in HTML?

Bijvoorbeeld:

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

Uitvoer:

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

Zoiets is te eenvoudig, omdat het niet (correct) tekstgebieden, selecties, keuzerondjes en selectievakjes bevat:

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

Antwoord 1, autoriteit 100%

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

demo


Antwoord 2, autoriteit 92%

Gebruik $('form').serializeArray(), waarmee een matrix:

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

Andere optie is $('form').serialize(), die een tekenreeks:

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

Bekijk deze jsfiddle-demo


Antwoord 3, autoriteit 52%

Bijgewerkt antwoord voor 2014:HTML5 FormDatawel dit

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

Je kunt formData dan precies zo posten als het is – het bevat alle namen en waarden die in het formulier worden gebruikt.


Antwoord 4, autoriteit 44%

Gebaseerd op jQuery.serializeArray, retourneert sleutel-waardeparen.

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

Antwoord 5, autoriteit 19%

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

Dit is een nitpicky antwoord, maar laat me uitleggen waarom dit een betere oplossing is:

  • We zijn goed afgehandeld een formulier in plaats van een knopdrukken. Sommige mensen willen graag invoeren op velden. Sommige mensen gebruiken alternatieve invoerapparaten zoals spraakinvoer of andere toegankelijkheidsapparaten. Behandel het formulier in en u los het voor iedereen correct op.

  • We graven in de formuliergegevens voor het werkelijke formulier dat is ingediend. Als u later uw formulierselector wijzigt, hoeft u de selectors niet voor alle velden te wijzigen. Verder heb je misschien verschillende vormen met dezelfde ingangsnamen. Het is niet nodig om te disambigueren met overmatige ID’s en wat niet, volg de ingangen op basis van het ingediende formulier. Hiermee kunt u ook een handler met één evenement gebruiken voor meerdere formulieren indien dat geschikt is voor uw situatie.

  • De Formdata-interface is redelijk nieuw, maar wordt goed ondersteund door browsers. Het is een geweldige manier om die gegevensverzameling te bouwen om de echte waarden van wat in de vorm is te krijgen. Zonder het zal je door alle elementen moeten lopen (zoals met form.elements) en zoek uit wat is gecontroleerd, wat is dat niet, wat de waarden zijn, enz. Totaal mogelijk Als u oude browsersteun nodig heeft, maar de Formdata-interface eenvoudiger is.

  • Ik gebruik hier ES6 … geen vereiste op welke manier dan ook, dus verander het terug om een ​​ES5-compatibel te zijn als u oude browser-ondersteuning nodig hebt.


Antwoord 6, Autoriteit 15%

Het is 2019 en er is een betere manier om dit te doen:

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

of als u in plaats daarvan een gewoon object wilt

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

houd er echter rekening mee dat dit niet werkt met dubbele sleutels zoals je krijgt van meervoudige selectie en dubbele selectievakjes met dezelfde naam.


Antwoord 7, autoriteit 5%

gebruik .serializeArray() om de gegevens in array-indeling te krijgen en converteer deze vervolgens naar een object:

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

Antwoord 8, autoriteit 5%

Hier is een heel eenvoudige en korte oplossing waarvoor zelfs geen JQuery nodig is.

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;

Antwoord 9, autoriteit 3%

Ik gebruik dit:

jQuery-plug-in

(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-formulier

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

De gegevens ophalen

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

Antwoord 10, autoriteit 3%

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

anders zou je kunnen kijken naar serialize();


Antwoord 11, autoriteit 2%

Hier is een werkende JavaScript-implementatie die correct omgaat met selectievakjes, keuzerondjes en schuifregelaars (waarschijnlijk ook andere invoertypen, maar ik heb deze alleen getest).

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

Werkvoorbeeld:

   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>

Antwoord 12, autoriteit 2%

De eenvoudigste manier, 2021.

document.querySelector('form').addEventListener('submit', (e) => {
  const data = Object.fromEntries(new FormData(e.target).entries());
  console.log(data)
});

Uitvoer

{ name: 'Stackoverflow' }

Antwoord 13, autoriteit 2%

Als je jQuery gebruikt, is hier een kleine functie die doet wat je zoekt.

Voeg eerst een ID toe aan uw formulier (tenzij dit het enige formulier op de pagina is, dan kunt u gewoon ‘form’ gebruiken als de dom-query)

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

De uitvoer zou er als volgt uitzien:

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

Antwoord 14, autoriteit 2%

Ik heb het antwoord toegevoegd om ook het vereiste object terug te geven.

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

Antwoord 15, autoriteit 2%

Op basis van de reactie van neuront heb ik een eenvoudige JQuery-methode gemaakt die de formuliergegevens in sleutel-waardeparen krijgt, maar het werkt voor meervoudige selecties en voor array-invoer met name=’example[]’.

Zo wordt het gebruikt:

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

U kunt hieronder een voorbeeld vinden van de definitie en hoe het werkt.

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

Antwoord 16

U kunt ook de FormData-objecten gebruiken; Met het FormData-object kunt u een set sleutel/waarde-paren compileren om te verzenden met XMLHttpRequest. Het is voornamelijk bedoeld voor gebruik bij het verzenden van formuliergegevens, maar kan onafhankelijk van formulieren worden gebruikt om ingetoetste gegevens te verzenden.

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

Antwoord 17

Hiermee worden alle formuliervelden toegevoegd aan het JavaScript-object “res”:

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

Antwoord 18

var formData = new FormData($('#form-id'));
params   = $('#form-id').serializeArray();
$.each(params, function(i, val) {
    formData.append(val.name, val.value);
});

Antwoord 19

Voor degenen onder u die de voorkeur geven aan een Objectin plaats van een geserialiseerde tekenreeks (zoals degene die wordt geretourneerd door $(form).serialize(), en een kleine verbetering van $(form).serializeArray()), gebruik gerust de onderstaande code:

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

Om het uit te voeren, gebruik je gewoon Form.serialize(form)en de functie retourneert een Objectvergelijkbaar met dit:

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

Als bonus betekent dit dat u niet de hele bundel jQueryhoeft te installeren voor slechts één serialisatiefunctie.


Antwoord 20

Ik heb een bibliotheek geschreven om dit probleem op te lossen: JSONForms. Het neemt een formulier aan, doorloopt elke invoer en bouwt een JSON-object dat u gemakkelijk kunt lezen.

Stel dat je het volgende formulier hebt:

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

Als u het formulier doorgeeft aan de coderingsmethode van JSONForms, krijgt u het volgende object:

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

Hier is demomet je formulier.


Antwoord 21

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

Antwoord 22

je kunt deze functiegebruiken om een object of een JSON van formulier te hebben.

p>

voor gebruik:

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

Antwoord 23

$( "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>

Antwoord 24

Ik heb een functie geschreven die voor meerdere selectievakjes en meerdere selecties zorgt. In die gevallen retourneert het een array.

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;
    }, {});
}

Antwoord 25

Velden en invoerbestand van het formulier invoeren om uw formulier in te dienen zonder pagina Vernieuwen en alle waarden met bestand te grijpen, zijn hierin

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

Antwoord 26

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

Het lost het probleem op: kon niet werken met meervoudige selecties.


Antwoord 27

Jullie hebben allemaal niet helemaal gelijk. U kunt niet schrijven:

formObj[input.name] = input.value;

Omdat op deze manier, als u een meerkeuzelijst heeft, de waarden ervan worden overschreven door de laatste, aangezien deze wordt verzonden als: “param1” : “value1”, “param1” : “value2”.

Dus de juiste aanpak is:

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

Antwoord 28

Deze methode zou het moeten doen. Het serialiseert de formuliergegevens en converteert ze vervolgens naar een object. Zorgt ook voor groepen selectievakjes.

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

Antwoord 29

Hier is een mooie vanilla JS-functie die ik heb geschreven om formuliergegevens als een object te extraheren. Het heeft ook opties voor het invoegen van toevoegingen in het object en voor het wissen van de formulierinvoervelden.

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

Hier is een voorbeeld van het gebruik ervan met een postverzoek:

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

Antwoord 30

Hier is mijn versie in vanilla JS (getest in Chrome)

werkt met:

  • name=”input”
  • name=”form[name]” (maakt een object)
  • name=”checkbox[]” (maakt een object met een array)
  • name=”form[checkbox][]” (maakt een array)
  • name=”form[select][name]” (maakt een object met een object dat alleen de geselecteerde waarde bevat)
/**
 * Get the values from a form
 * @param formId ( ID without the # )
 * @returns {object}
 */
function getFormValues( formId )
{
    let postData = {};
    let form = document.forms[formId];
    let formData = new FormData( form );
    for ( const value of formData.entries() )
    {
        let container = postData;
        let key = value[0];
        let arrayKeys = key.match( /\[[\w\-]*\]/g ); // Check for any arrays
        if ( arrayKeys !== null )
        {
            arrayKeys.unshift( key.substr( 0, key.search( /\[/ ) ) );  // prepend the first key to the list
            for ( let i = 0, count = arrayKeys.length, lastRun = count - 1; i < count; i++ )
            {
                let _key = arrayKeys[i];
                _key = _key.replace( "[", '' ).replace( "]", '' ); // Remove the brackets []
                if ( _key === '' )
                {
                    if ( ! Array.isArray( container ) )
                    {
                        container = [];
                    }
                    _key = container.length;
                }
                if ( ! (_key in container) ) // Create an object for the key if it doesn't exist
                {
                    if ( i !== lastRun && arrayKeys[i + 1] === '[]' )
                    {
                        container[_key] = [];
                    }
                    else
                    {
                        container[_key] = {};
                    }
                }
                if ( i !== lastRun ) // Until we're the last item, swap container with it's child
                {
                    container = container[_key];
                }
                key = _key;
            }
        }
        container[key] = value[1]; // finally assign the value
    }
    return postData;
}

Other episodes