Come posso ottenere i dati del modulo con JavaScript / jQuery?


404

Esiste un modo semplice e di una riga per ottenere i dati di un modulo come sarebbe se fosse inviato nel classico modo solo HTML?

Per esempio:

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

Produzione:

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

Qualcosa del genere è troppo semplice, poiché non include (correttamente) textareas, seleziona, pulsanti di opzione e caselle di controllo:

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

3
Un'altra domanda simile a questo: stackoverflow.com/questions/169506/...
Marcelo Rodovalho

Risposte:


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

dimostrazione


15
Chiudi, ma forse qualcosa che restituisce un array con coppie chiave-valore anziché una singola stringa?
Bart van Heukelom,

80
Nvm, l'ho trovato nei commenti per la funzione serialize (). Si chiama serializeArray. Restituisce una matrice di matrici (che contengono una voce "nome" e "valore") ma che dovrebbe essere abbastanza facile da trasformare.
Bart van Heukelom,

22
E usando la libreria di sottolineatura può essere trasformato usando:_.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))
MhdSyrwan

8
@BartvanHeukelom So che sono trascorsi 4 anni, ma .serializeArray () restituirà un array.
Evangelista dell'API di TJ WealthEngine,

6
Assicurati che ogni tag di input includa l'attributo name, altrimenti non restituirà nulla.
Eugene Kulabuhov,

507

Usa $('form').serializeArray(), che restituisce un array :

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

Un'altra opzione è $('form').serialize(), che restituisce una stringa :

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

Dai un'occhiata a questa demo di jsfiddle


91
serializeArraysarebbe molto più utile se restituisse un oggetto con coppie chiave-valore
GetFree

8
Sono d'accordo che un oggetto sarebbe l'ideale. Tuttavia, c'è un problema: una chiave può avere più valori. Restituiresti un oggetto "array di valori" chiave o un "valore primo" o qualcos'altro? Penso che i ragazzi di jQuery non abbiano scelto nessuno dei precedenti :)
Paul

Essere consapevoli di un problema con più valori (come @Paul menzionato sopra), caselle di controllo e più input con name="multiple[]"non funzionano. La soluzione per il metodo POST è la stessa, basta usare $ ('form'). Serialize (). Inoltre, il metodo POST non ha un limite di 2000 caratteri come GET nella maggior parte dei browser, quindi può essere utilizzato anche per dati piuttosto grandi.
Artru,

Si noti inoltre che per poter registrare un valore da qualsiasi input del modulo, l'input deve avere un nameattributo.
Chris - Jr

@GetFree perché non usare semplicemente la funzione jQuery map? funzione getFormData (form) {var rawJson = form.serializeArray (); var model = {}; $ .map (rawJson, function (n, i) {model [n ['name']] = n ['value'];}); modello di ritorno; }
Tom McDonough,

196

Risposta aggiornata per il 2014: HTML5 FormData fa questo

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

È quindi possibile pubblicare formData esattamente come è: contiene tutti i nomi e i valori utilizzati nel modulo.


13
Più uno come formdata è buono e utile, ma vale la pena notare che se si desidera leggere i dati all'interno formdata non è così facile (vedi stackoverflow.com/questions/7752188/... )
StackExchange che diamine

1
Tieni presente che FormData fa parte delle funzionalità avanzate di XMLHttpRequest (precedentemente noto come XMLHttpRequest Level 2), quindi devi fare affidamento su un polyfill per Internet Explorer <10. caniuse.com/#feat=xhr2
Pier-Luc Gendreau,

3
@yochannah, non così. Certo, non si può semplicemente accedere e modificare i dati come un normale oggetto, ma è ancora banale ottenere i dati. Scopri il entries()metodo [pagina MDN ].
Web e Flow,

@Web and Flow grazie per averlo segnalato! Mi piace quando i browser aggiungono funzionalità nuove e utili :) volte, stanno cambiando.
StackExchange What The Heck il

Sto cercando di usare FormData per inviare un oggetto al mio script Flask-Python, ma non sembra essere un normale oggetto richiesta che posso decomprimere. Qualcuno può indicare una spiegazione di eventuali passaggi speciali per gestirlo sul lato server? Ecco dove mi sembra vuoto.
Manisha,

181

Basato su jQuery.serializeArray, restituisce coppie chiave-valore.

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

12
Coppie chiave-valore qui, ragazzi, tutti, vieni qui! È d'oro !!! Grazie! Se voglio un valore di un elemento chiamato "rivenditore", eseguo questo console.log ($ ('# form'). SerializeArray (). Reduce (function (obj, item) {obj [item.name] = item. valore; return obj;}, {}) ['rivenditore']);
Yevgeniy Afanasyev,

Ho creato ieri un metodo JQuery basato su questa risposta, ma lavorando con più selezioni e array di input (con il nome 'esempio []'). Puoi trovarlo nella mia risposta qui sotto. Comunque, buon approccio neuront, grazie! :)
manuman94

Questo mi si addiceva di più, tra tutte le risposte!
VPetrovic,

Questo IMHO è la risposta migliore!
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
});

Questa è una risposta nitida, ma lasciami spiegare perché questa è una soluzione migliore:

  • Stiamo gestendo correttamente l'invio di un modulo anziché la pressione di un pulsante. Ad alcune persone piace premere Invio sui campi. Alcune persone usano dispositivi di input alternativi come input vocali o altri dispositivi di accessibilità. Gestisci l'invio del modulo e lo risolvi correttamente per tutti.

  • Stiamo scavando nei dati del modulo per il modulo effettivo che è stato inviato. Se si modifica il selettore di moduli in un secondo momento, non è necessario modificare i selettori per tutti i campi. Inoltre, potresti avere diversi moduli con gli stessi nomi di input. Non è necessario disambiguare con ID eccessivi e cosa no, basta tenere traccia degli input in base al modulo che è stato inviato. Ciò consente inoltre di utilizzare un singolo gestore eventi per più moduli, se appropriato per la propria situazione.

  • L'interfaccia FormData è abbastanza nuova, ma è ben supportata dai browser. È un ottimo modo per creare quella raccolta di dati per ottenere i valori reali di ciò che è nel modulo. Senza di essa, dovrai scorrere tutti gli elementi (come con form.elements) e capire cosa è selezionato, cosa non lo è, quali sono i valori, ecc. Totalmente possibile se hai bisogno del vecchio supporto del browser, ma FormData l'interfaccia è più semplice.

  • Sto usando ES6 qui ... non è un requisito in alcun modo, quindi ripristinalo in ES5 compatibile se hai bisogno del vecchio supporto del browser.


a proposito, gli oggetti FormData non espongono i loro valori. Per ottenere un oggetto semplice da esso, vedi stackoverflow.com/questions/41431322/...
phil294

2
@Blauhirn Nonsense, ovviamente espongono i valori. Il codice nella mia risposta funziona. Dovresti provarlo. Qui, ho creato un violino per te: jsfiddle.net/zv9s1xq5 Se vuoi un iteratore, usa formData.entries().
Brad

So che funziona, ma le proprietà non sono accessibili dalla chiave. Ad esempio, formData.foo non è definito. Come visto nella tua risposta, .get() deve essere chiamato per ciò che penso sia scomodo. Forse "non espone" è arrivato nel modo sbagliato. Quindi, per generare qualcosa di simile { foo: 'bar' }a un submitevento, devi iterarli manualmente. Da qui il . To get a plain object from it, see [link].
phil294,

1
@Blauhirn Ti sbagli. XMLHttpRequest supporta direttamente FormData. xhr.send(formData);
Brad

1
@ Blauhirn JSON.stringify([...formData]) Oppure, se vuoi che le tue chiavi / valori siano separati ... [...formData].reduce((prev, cur) => { prev[cur[0]] = cur[1]; return prev;}, {})
Brad

25

usa .serializeArray () per ottenere i dati in formato array e poi convertirli in un oggetto:

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

Questo sovrascrive le mie caselle di controllo se ho qualcosa di simile <input type="checkbox" name="someList" value="one" /> <input type="checkbox" name="someList" value="two" />. Se entrambi sono selezionati, l'oggetto contiene solo il secondo valore della casella di controllo.
dmathisen,

2
Non è questo un caso dove someListdovrebbe essere type="radio"?
dylanjameswagner,

voto perché la risposta accettata non restituisce un oggetto con le chiavi come:name:value
Matt-the-Marxist,

24

Ecco un soluton davvero semplice e breve che non richiede nemmeno 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
Questo non funziona con i pulsanti di opzione: l'ultima opzione è sempre quella memorizzata postData.
Kyle Falconer,

3
Grazie per averci dato una risposta non jquery.
Glen Pierce,

24

È il 2019 e c'è un modo migliore per farlo:

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

o se invece vuoi un oggetto semplice

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

anche se questo non funzionerà con chiavi duplicate come quelle ottenute da caselle di selezione multipla e duplicate con lo stesso nome.


Totalmente. Tuttavia, non ho ottenuto un array per un elenco di input che hanno tutti lo stesso nome, il che significava che dovevo usare document.getElementsByClassNamee un ciclo for ma hey, ancora più bello che richiedere jQuery ecc.
alphanumeric0101

1
Questa risposta è la mia preferita. Ma dovrebbe leggere document.querySelectorinvece di solo querySelector.
Adabru,

Nota "FormData utilizzerà solo i campi di input che utilizzano l'attributo name" - da MDN
binaryfunt


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

a parte questo, potresti voler guardare serialize () ;


13

Io lo uso questo:

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

Modulo HTML

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

Ottieni i dati

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

Si noti che questo plugin non funziona nei casi in cui sono presenti più voci di input del modulo con lo stesso nome. L'ultima voce sostituirà la precedente, mentre il comportamento previsto sarebbe quello di ottenere tutti i valori comeArray
Milli

1
Solo una nota che un anno dopo ora penso che questa sia una risposta terribile e nessuno dovrebbe usarla. Come dice il commento precedente, cose come i pulsanti di opzione non funzionerebbero. Ci sono risposte migliori sopra, usa invece una di quelle.
Dustin Poissant,

11

Ecco un'implementazione solo funzionante di JavaScript che gestisce correttamente caselle di controllo, pulsanti di opzione e cursori (probabilmente anche altri tipi di input, ma li ho solo testati).

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

Esempio funzionante:

    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>

modificare:

Se stai cercando un'implementazione più completa, dai un'occhiata a questa sezione del progetto per cui l'ho realizzato . Aggiornerò questa domanda alla fine con la soluzione completa che mi è venuta in mente, ma forse questo sarà utile a qualcuno.


1
Bella soluzione :) Ho trovato un bug, con la funzione setOrPush. Non include un controllo per vedere se la destinazione è già un array, causando la creazione di un array nidificato profondo nel caso di più caselle di controllo selezionate con lo stesso nome.
Wouter van Dam,

@KyleFalconer Nice! Perché non hai unito le custodie degli interruttori per la radio e la casella di controllo: funzioneranno correttamente (immagino).
Ethan,

@Ethan È perché una casella di controllo può avere più valori selezionati e una radio può avere sempre e solo un valore selezionato, quindi il modo in cui memorizzo il valore cambia.
Kyle Falconer,

@KyleFalconer Sì, lo capisco. Il codice per la gestione di "checkbox" si occupa anche dell'unica scelta possibile per "radio", in virtù della routine "SetOrPush".
Ethan,

@Ethan Oh, penso di sapere cosa stai dicendo. Potrebbe essere fatto in entrambi i modi, ma penso di averlo fatto in questo modo solo perché volevo un solo valore, non un array di valori.
Kyle Falconer,

9

Se stai usando jQuery, ecco una piccola funzione che farà quello che stai cercando.

Innanzitutto, aggiungi un ID al tuo modulo (a meno che non sia l'unico modulo nella pagina, quindi puoi semplicemente usare 'form' come query 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>

L'output sarebbe simile a:

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

7

Puoi anche usare gli oggetti FormData ; L'oggetto FormData consente di compilare un set di coppie chiave / valore da inviare utilizzando XMLHttpRequest. È destinato principalmente all'uso nell'invio di dati di modulo, ma può essere utilizzato indipendentemente dai moduli per trasmettere dati codificati.

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

Grazie, ma cosa succede se non si dispone di un documento d'identità? Cosa succede se si dispone di un modulo come oggetto JQuery? var form = $ (this) .closest ('form'); ? Dovrebbe var formElement = document.getElementById (form [0]); funziona invece la tua prima linea? Beh, purtroppo non funziona. Sai perché?
Yevgeniy Afanasyev,

In realtà il FormData non è supportato da tutti i browser :( quindi meglio usare un approccio diverso
numediaweb

Grazie. Ho usato l'ultima versione di Chrome e ancora non funzionava. Quindi sono andato con #neuront risposta dall'alto.
Yevgeniy Afanasyev,

6

Questo aggiungerà tutti i campi del modulo all'oggetto JavaScript "res":

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

Probabilmente perché questa stessa identica risposta era già stata pubblicata nel 2010.
nathanvda,

Non lo sapevo. Per una risposta così breve non è sorprendente. E anche così, dov'è il riferimento?
gamliela,

Sul serio? Non credi al mio commento senza riferimento e non puoi nemmeno guardare l'elenco delle risposte per vedere se sono uguali? stackoverflow.com/a/2276469/216513
nathanvda

Pensavo intendessi una risposta in un'altra domanda. Non ricordo ora i dettagli e le mie ragioni; forse perché non è esattamente lo stesso
gamliela

1
Risposta perfetta per qualcuno che vuole che funzioni per l'input, selezionare multiple e textarea. Perché, usando serialize non otterrai tutti gli elementi che sono selezionati nel tag select. Ma usando .val () otterrai esattamente ciò che vuoi come array. Risposta semplice e diretta.
Sailesh Kotha,

6

Ho incluso la risposta per restituire anche l'oggetto richiesto.

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

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

return model;
}

Questo non gestirà affatto le matrici; foo[bar][] = 'qux'dovrebbe serializzare a { foo: { bar: [ 'qux' ] } }.
anfetamachina,

6

Sulla base della risposta di Neuront ho creato un semplice metodo JQuery che ottiene i dati del modulo in coppie chiave-valore ma funziona per selezioni multiple e per input di array con nome = 'esempio []'.

Ecco come viene utilizzato:

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

Di seguito puoi trovare un esempio della sua definizione e di come funziona.

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

puoi usare questa funzione per avere un oggetto o un JSON dal modulo.

per usarlo:

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
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - Dalla recensione
Wahyu Kristianto,

Ma questo link ha una funzione per aiutare il suo (credo). Ma la prossima volta inserirò il codice.
Marcos Costa,

3

Ho scritto una libreria per risolvere proprio questo problema: JSONForms . Prende una forma, passa attraverso ogni input e crea un oggetto JSON che puoi facilmente leggere.

Supponi di avere il seguente modulo:

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

Passare il modulo al metodo di codifica JSONForms restituisce il seguente oggetto:

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

Ecco la demo con il tuo modulo.


Sembra e funziona bene, grazie. Solo una cosa, la versione minimizzata chiama un file di mappa, dovrebbe essere imo opzionale.
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>

Codepen


2

Per quelli di voi che preferiscono una Objectstringa piuttosto che una stringa serializzata (come quella restituita da $(form).serialize(), e un leggero miglioramento su $(form).serializeArray()), sentitevi liberi di usare il codice qui sotto:

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

Per eseguirlo, basta usare Form.serialize(form)e la funzione restituirà un Objectsimile a questo:

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

Come bonus, significa che non è necessario installare l'intero pacchetto di jQuery solo per una funzione di serializzazione.


1

Ho scritto una funzione che si occupa di più caselle di controllo e selezioni multiple. In questi casi restituisce un 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;
    }, {});
}

1

mostrando i campi dell'elemento di input del modulo e il file di input per inviare il modulo senza aggiornamento della pagina e prendere tutti i valori con il file incluso in esso eccolo qui

<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>
sulla pagina del pulsante Invia invierà una richiesta Ajax al tuo file 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 !');

                }

     });

}))


Qual è la necessità di nuovi FormData qui?
Sahu V Kumar,

1
@VishalKumarSahu Sto caricando un file, quindi è per questo che utilizzo formData per questo.
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;
}, {});

Risolverà il problema: impossibile lavorare con le selezioni multiple.


0

Non siete tutti completamente corretti. Non puoi scrivere:

formObj[input.name] = input.value;

Perché in questo modo se si dispone di un elenco a selezione multipla, i suoi valori verranno sovrascritti con l'ultimo, poiché viene trasmesso come: "param1": "value1", "param1": "value2".

Quindi, l'approccio corretto è:

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

Questo metodo dovrebbe farlo. Serializza i dati del modulo e li converte in un oggetto. Si occupa anche di gruppi di caselle di controllo.

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

Funziona per le caselle di controllo, ma non per i pulsanti di opzione in cui i controlli condividono l' nameattributo.
Kyle Falconer,

0

Ecco una bella funzione JS vanigliata che ho scritto per estrarre i dati del modulo come oggetto. Dispone inoltre di opzioni per l'inserimento di aggiunte nell'oggetto e per cancellare i campi di input del modulo.

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

Ecco un esempio del suo utilizzo con una richiesta post:

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))
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.