$ (this) .serialize () - Wie füge ich einen Wert hinzu?

104

Derzeit habe ich Folgendes:

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

Dies funktioniert gut, ich möchte jedoch einen Wert zu Daten hinzufügen, also habe ich es versucht

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

Aber das hat nicht richtig gepostet. Irgendwelche Ideen, wie Sie der Serialisierungszeichenfolge ein Element hinzufügen können? Dies ist eine globale Seitenvariable, die nicht formularspezifisch ist.

Der Ausgang
quelle
Können Sie klarstellen, was "das hat nicht richtig gepostet" bedeutet? Was ist passiert? Was wurde vom Server empfangen?
Matt B
6
Sollte das nicht sein '&NonFormValue=' + NonFormValue?
Wesley Murch

Antworten:

103

Anstatt

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

du willst wahrscheinlich

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

Sie sollten darauf achten, den Wert von URL-zu codieren, NonFormValuewenn er Sonderzeichen enthält.

matt b
quelle
1
Verwenden Sie, encodeURIComponentum sicherzustellen, dass die NonFormValuekeine Sonderzeichen hat
Yahya Uddin
196

Während die Antwort von matt b funktioniert, können Sie auch .serializeArray()ein Array aus den Formulardaten abrufen, es ändern und jQuery.param()es in ein URL-codiertes Formular konvertieren. Auf diese Weise übernimmt jQuery die Serialisierung Ihrer zusätzlichen Daten für Sie.

var data = $(this).serializeArray(); // convert form to array
data.push({name: "NonFormValue", value: NonFormValue});
$.ajax({
    type: 'POST',
    url: this.action,
    data: $.param(data),
});
Leigh Brenecki
quelle
14
Dies ist definitiv die beste Option. Überlassen Sie die Serialisierung vollständig jQuery und können Sie dennoch neue Werte zu den aus dem Formular abgerufenen hinzufügen.
jcsanyi
5
Dies ist der beste Weg, es zu tun, kein Spiel mit Streichern
Brett Gregson
Dies sollte die akzeptierte Antwort sein. Sauber und richtig
Mike Aron
7

Erstens sollte nicht

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

Sein

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

und zweitens können Sie verwenden

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

oder wenn die Aktion bereits Parameter enthält

url: this.action + '&NonFormValue=' + NonFormValue,
Nikhil Bhandari
quelle
Ihre zweite Antwort hätte nicht den gleichen Effekt wie die Frage. NonFormValuewürde als URL-Parameter gesendet, nicht in den POST-Daten. Dies ist möglicherweise nicht ideal, wenn a) was auch immer auf der Serverseite ausgeführt wird, erwartet, dass es veröffentlicht wird (z. B. request.POSTanstelle von request.REQUESTDjango) oder b) NonFormValueaus Sicherheitsgründen oder aus Gründen nicht in der URL-Leiste oder im Verlauf angezeigt wird Es ist ein vorübergehender Wert.
Leigh Brenecki
6

Fügen Sie den Artikel zuerst hinzu und serialisieren Sie dann:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $.extend($(this), {'NonFormValue': NonFormValue}).serialize()
});
Mrchief
quelle
1
Hat auch bei mir nicht funktioniert. Es erweitert zwar das Objekt, funktioniert aber nicht wie erwartet.
Punitcse
5

Vergessen Sie nicht, dass Sie immer Folgendes tun können:

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

in Ihrer tatsächlichen Form, die je nach Fall für Ihren Code besser sein kann.

Jonathan
quelle
2

Wir können mögen:

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

Beispielsweise:

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
    }
});
Tapeshwar
quelle
0

Sie können eine zusätzliche Funktion schreiben, um Formulardaten zu verarbeiten, und Sie sollten Ihre Nichtformulardaten als Datenwert in das Formular einfügen. Siehe Beispiel:

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

Fügen Sie dann diese Abfrage für die Formularverarbeitung hinzu

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

Jithin Vijayan
quelle
0

das ist besser:

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')
Eugen
quelle
Bitte fügen Sie eine detailliertere Beschreibung hinzu, warum dies ein besserer Ansatz ist.
Mark
Ein Zeilencode und Sie können das json-Objekt für weitere Parameter verwenden.
Eugene