jQuery post () mit Serialisierung und zusätzlichen Daten


147

Ich versuche herauszufinden, ob es möglich ist, serialize()Daten und andere Daten außerhalb des Formulars zu veröffentlichen.

Hier ist, was ich dachte, würde funktionieren, aber es sendet nur 'wordlist'und nicht die Formulardaten.

$.post("page.php",( $('#myForm').serialize(), { 'wordlist': wordlist }));

Hat jemand irgendwelche Ideen?

Antworten:


329

Sie können serializeArray [docs] verwenden und die zusätzlichen Daten hinzufügen:

var data = $('#myForm').serializeArray();
data.push({name: 'wordlist', value: wordlist});

$.post("page.php", data);

11
Hmm. Ich denke, das gefällt mir besser als meine Lösung :) Ich werde dies möglicherweise in Zukunft tun.
Michael Mior

@ Gudradain: Es funktioniert gut: jsfiddle.net/fnjncqhv . Wenn es bei Ihnen nicht funktioniert, haben Sie ein anderes Problem.
Felix Kling

Nein, tut es nicht. jsfiddle.net/fnjncqhv/1 serializeArray () erzeugt ein Array von Objekten, wobei jedes Objekt eine einzelne Eigenschaft enthält. Wenn Ihr Datenobjekt mehr als eine Eigenschaft enthält (wie in Ihrem Beispiel), erzeugt es ein ungültiges Objekt und wird nicht gebunden die Serverseite. Bitte bearbeiten Sie Ihre Antwort, um das Problem zu beheben.
Gudradain

2
@ Gudradain: Bitte beachten Sie meinen Kommentar zu Ihrer Antwort. Sie liegen falsch. serializeArrayerzeugt nicht die Struktur, von der Sie denken, dass sie es tut. Ich bin mir nicht sicher, was Sie mit Ihrer Demo zeigen wollen. Sie alarmieren nur die Länge des Arrays. Wenn Sie meine Demo nicht überzeugt, schauen Sie sich bitte die Dokumentation an .
Felix Kling

1
@FelixKling Entschuldigung für diesen fehlgeschlagenen Moment und danke für die Erklärung. Wusste nicht, dass Sie wirklich das Format {Name: 'Ihr-Parameter-Name', Wert: 'Ihr-Parameter-Wert'} für jeden Parameter benötigen, den Sie hinzufügen möchten.
Gudradain


9

Eine alternative Lösung für den Fall, dass Sie dies beim Hochladen einer Ajax-Datei tun müssen:

var data = new FormData( $('#form')[0] ).append( 'name' , value );

ODER noch einfacher.

$('form').on('submit',function(e){

    e.preventDefault();
    var data = new FormData( this ).append('name', value );

    // ... your ajax code here ...

    return false;

});

5

Wenn Sie den Formulardaten ein Javascript-Objekt hinzufügen möchten, können Sie den folgenden Code verwenden

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeArray();
for (var key in data) {
    if (data.hasOwnProperty(key)) {
        postData.push({name:key, value:data[key]});
    }
}
$.post(url, postData, function(){});

Wenn Sie die Methode serializeObject () hinzufügen , können Sie Folgendes tun

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeObject();
$.extend(postData, data);
$.post(url, postData, function(){});

1
Dadurch wird im Grunde ein Array generiert, das aussieht [{name: 'wordlist'}, {value: wordlist}]. Das ist nicht in einem Format, das jQuery versteht, daher bezweifle ich, dass dies tatsächlich funktioniert.
Felix Kling

@FelixKling serializeArray () erzeugt [{name1: 'value1'}, {name2: 'value2'}]. Wenn Sie Objektdaten {name3: 'value3', name4: 'value4'} haben und diese von serializeArray () in das Array verschieben, erhalten Sie [{name1: 'value1'}, {name2: 'value2'}, { name3: 'value3', name4: 'value4'}]. Das letzte Objekt im Array ist ungültig und Sie erhalten kein Ergebnis.
Gudradain

" serializeArray()produzieren [{name1: 'value1'}, {name2: 'value2'}]." Nein, das tut es nicht: jsfiddle.net/akyz1Lcy
Felix Kling

4

In der neuen Version von jquery könnte dies über die folgenden Schritte erfolgen:

  • Holen Sie sich das Param-Array über serializeArray()
  • Aufruf push()oder ähnliche Methoden, um dem Array zusätzliche Parameter hinzuzufügen,
  • Aufruf $.param(arr), um eine serialisierte Zeichenfolge abzurufen, die als Parameter von jquery ajax verwendet werden datakann.

Beispielcode:

var paramArr = $("#loginForm").serializeArray();
paramArr.push( {name:'size', value:7} );
$.post("rest/account/login", $.param(paramArr), function(result) {
    // ...
}

3
$.ajax({    
    type: 'POST',  
    url: 'test.php',  
    data:$("#Test-form").serialize(),  
    dataType:'json',
     beforeSend:function(xhr, settings){
     settings.data += '&moreinfo=MoreData';
     },
    success:function(data){
            //  json response  
    },
    error: function(data) { 
        // if error occured
    }
    });

2

Das Formular könnte die zusätzlichen Daten als ausgeblendete Felder enthalten, die Sie unmittelbar vor dem Senden der AJAX-Anforderung an die entsprechenden Werte festlegen würden.

Eine andere Möglichkeit besteht darin, dieses kleine Juwel zu verwenden, um Ihr Formular in ein Javascript-Objekt (anstelle einer Zeichenfolge) zu serialisieren und die fehlenden Daten hinzuzufügen:

var data = $('#myForm').serializeObject();
// now add some additional stuff
data['wordlist'] = wordlist;
$.post('/page.php', data);

Es ist keine Funktion benannt serializeObject. Woher hast du das?
Jereme Causing

1

Sie können dies verwenden

var data = $("#myForm").serialize();
data += '&moreinfo='+JSON.stringify(wordlist);

0

Ich mag es, Objekte als Objekte zu behalten und keine verrückten Typverschiebungen zu machen. Hier ist mein Weg

var post_vars = $('#my-form').serializeArray();
$.ajax({
  url: '//site.com/script.php',
  method: 'POST',
  data: post_vars,
  complete: function() {
    $.ajax({
      url: '//site.com/script2.php',
      method: 'POST',
      data: post_vars.concat({
        name: 'EXTRA_VAR',
        value: 'WOW THIS WORKS!'
      })
    });
  }
});

Wenn Sie von oben nicht sehen können, habe ich die .concat-Funktion verwendet und ein Objekt mit der Post-Variablen als 'Name' und dem Wert als 'Wert' übergeben!

Hoffe das hilft.

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.