$ (this) .serialize () - Come aggiungere un valore?


105

attualmente ho quanto segue:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize(),
});

Funziona bene, tuttavia vorrei aggiungere un valore ai dati, quindi ho provato

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize() + '&=NonFormValue' + NonFormValue,
});

Ma non è stato pubblicato correttamente. Qualche idea su come aggiungere un articolo alla stringa di serializzazione? Questa è una variabile di pagina globale che non è specifica del modulo.


Puoi chiarire cosa significa "che non è stato pubblicato correttamente"? Quello che è successo? Cosa è stato ricevuto dal server?
matt b

6
Non dovrebbe essere quello '&NonFormValue=' + NonFormValue?
Wesley Murch

Risposte:


103

Invece di

 data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

probabilmente vuoi

 data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

Dovresti fare attenzione a codificare in URL il valore di NonFormValuese potrebbe contenere caratteri speciali.


1
utilizzare encodeURIComponentper garantire che NonFormValuenon abbia caratteri speciali
Yahya Uddin

197

Mentre la risposta di matt b funzionerà, puoi anche utilizzare .serializeArray()per ottenere un array dai dati del modulo, modificarlo e usarlo jQuery.param()per convertirlo in un modulo con codifica URL. In questo modo, jQuery gestisce la serializzazione dei tuoi dati extra per te.

var data = $(this).serializeArray(); // convert form to array
data.push({name: "NonFormValue", value: NonFormValue});
$.ajax({
    type: 'POST',
    url: this.action,
    data: $.param(data),
});

14
Questa è sicuramente l'opzione migliore: lasciare la serializzazione interamente a jQuery, pur avendo la possibilità di aggiungere nuovi valori a quelli recuperati dal form.
jcsanyi

5
Questo è il modo migliore per farlo, non suonare con gli archi
Brett Gregson il

Questa dovrebbe essere la risposta accettata. Pulito e nel modo giusto
Mike Aron

7

in primo luogo non dovrebbe

data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

essere

data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

e in secondo luogo puoi usare

url: this.action + '?NonFormValue=' + NonFormValue,

o se l'azione contiene già dei parametri

url: this.action + '&NonFormValue=' + NonFormValue,

La tua seconda risposta non avrebbe lo stesso effetto di quanto richiesto dalla domanda; NonFormValueverrebbe inviato come parametro URL, non nei dati POST. Questo potrebbe non essere l'ideale se a) tutto ciò che è in esecuzione sul lato server si aspetta che venga inviato tramite POST (ad es. Utilizzando request.POSTinvece che request.REQUESTin Django), oppure b) NonFormValueè qualcosa che non dovrebbe apparire nella barra degli URL o nella cronologia né per motivi di sicurezza o perché è un valore transitorio.
Leigh Brenecki

6

Aggiungi prima l'articolo e poi serializza:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $.extend($(this), {'NonFormValue': NonFormValue}).serialize()
});

1
Non ha funzionato anche per me. Anche se estende l'oggetto ma non ha funzionato come previsto.
Punitcse

5

Non dimenticare che puoi sempre fare:

<input type="hidden" name="NonFormName" value="NonFormValue" />

nella tua forma attuale, che potrebbe essere migliore per il tuo codice a seconda del caso.


2

Possiamo fare come:

data = $form.serialize() + "&foo=bar";

Per esempio:

var userData = localStorage.getItem("userFormSerializeData");
var userId = localStorage.getItem("userId");

$.ajax({
    type: "POST",
    url: postUrl,
    data: $(form).serialize() + "&" + userData + "&userId=" + userId,
    dataType: 'json',
    success: function (response) {
        //do something
    }
});

0

È possibile scrivere una funzione aggiuntiva per elaborare i dati del modulo e aggiungere i dati non di forma come valore dei dati nel modulo. Vedere l'esempio:

<form method="POST" id="add-form">
    <div class="form-group required ">
        <label for="key">Enter key</label>
        <input type="text" name="key" id="key"  data-nonformdata="hai"/>
    </div>
    <div class="form-group required ">
        <label for="name">Ente Name</label>
        <input type="text" name="name" id="name"  data-nonformdata="hello"/>
    </div>
    <input type="submit" id="add-formdata-btn" value="submit">
</form>

Quindi aggiungi questo jquery per l'elaborazione del modulo

<script>
$(document).onready(function(){
    $('#add-form').submit(function(event){
        event.preventDefault();
        var formData = $("form").serializeArray();
        formData = processFormData(formData);
        // write further code here---->
    });
});
processFormData(formData)
{
    var data = formData;
    data.forEach(function(object){
        $('#add-form input').each(function(){
            if(this.name == object.name){
                var nonformData = $(this).data("nonformdata");
                formData.push({name:this.name,value:nonformData});
            }
        });
    });
    return formData;
}


0

questo meglio:

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')

Si prega di aggiungere una descrizione più dettagliata del motivo per cui questo è un approccio migliore.
Contrassegna il

un codice di riga e puoi usare l'oggetto json per più parametri.
eugene
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.