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


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.


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

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,

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

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.


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

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


0

das ist besser:

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.