22 Stimmen

jquery serialize und $.post

Ich versuche, eine Menge von Daten aus einem Formular mit der $.post-Methode in jQuery zu senden. Ich habe die serialize()-Funktion zuerst verwendet, um alle Formulardaten in eine lange Zeichenfolge zu machen, die ich dann serverseitig explodieren wird. Das Seltsame ist, wenn ich versuche, es mit $.post zu senden, wird das Ergebnis von serialize() an die URL angehängt, als ob ich es mit GET senden würde. Hat jemand eine Idee, warum das passiert?

Hier ist die Jquery:

$("#addShowFormSubmit").click(function(){
  var perfTimes = $("#addShowForm").serialize();
  $.post("includes/add_show.php", {name: $("#showTitle").val(), results: perfTimes }, function(data) {
    $("#addShowSuccess").empty().slideDown("slow").append(data);
  });
});  

hier ist das php:

$show = $_POST['name'];
$results = $_POST['results'];
$perfs = explode("&", $results);
foreach($perfs as $perf) {
    $perf_key_values = explode("=", $perf);
    $key = urldecode($perf_key_values[0]);
    $values = urldecode($perf_key_values[1]);
}
echo $key, $values;

18voto

Jake Wilson Punkte 83540

Wenn Sie eine <button> Element, um die Serialisierung und Ajax zu aktivieren, und wenn das <button> Element befindet sich innerhalb der form Element, das button fungiert automatisch als Formularübermittlung, unabhängig davon, welche andere .click-Zuweisung Sie ihm mit jQuery geben.

type='submit'

<button></button> y <button type='submit'></button> sind ein und dasselbe. Sie übermitteln ein Formular, wenn sie innerhalb der <form> Element.

type='Schaltfläche'

<button type='button'></button> ist anders. Es handelt sich um eine normale Schaltfläche, die das Formular nicht abschickt (es sei denn, Sie veranlassen sie absichtlich, das Formular per JavaScript abzuschicken).

Und für den Fall, dass ein Formular Element kein Aktionsattribut angegeben ist, sendet diese Übermittlung die Daten einfach an dieselbe Seite zurück. Die Seite wird also aktualisiert, und die serialisierten Daten erscheinen in der URL, als ob Sie GET in Ihrem Ajax verwenden würden.

Mögliche Lösungen

1 - Machen Sie die <button> Typ button . Wie oben erläutert, wird dadurch verhindert, dass die Schaltfläche das Formular abschickt.

Vorher:

<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
    <button id='mySubmitButton'>Submit</button>
</form>

Danach:

<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
<button type='button' id='mySubmitButton'>Submit</button>
</form>

2 - Bewegen Sie die <button> Element außerhalb des <form> Element. Dadurch wird verhindert, dass die Schaltfläche das Formular abschickt.

Vorher:

<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
    <button id='mySubmitButton'>Submit</button>
</form>

Danach:

<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
</form>
<button id='mySubmitButton'>Submit</button>

3 - Hinzufügen der preventDefault() in den Button-Click-Handler, um zu verhindern, dass das Formular abgeschickt wird (Standardaktion):

$("#addShowFormSubmit").click(function(event){
  event.preventDefault();
  var perfTimes = $("#addShowForm").serialize();
  $.post("includes/add_show.php", {name: $("#showTitle").val(), results: perfTimes },      function(data) {
    $("#addShowSuccess").empty().slideDown("slow").append(data);
  });
});

Offensichtlich ohne zu sehen, alle Ihren Code, ich habe keine Ahnung, ob dies der Fall für Ihr Problem ist, aber der einzige Grund, den ich jemals gesehen habe Verhalten, das Sie beschreiben, ist, weil die Schaltfläche "Senden" war ein <button> ohne Angabe eines Typs.

7voto

Franz Punkte 1214

Versuchen Sie, serializeArray() anstelle von serialize() zu verwenden. serialize() erzeugt eine url-kodierte Abfragezeichenfolge, während serializeArray() eine JSON-Datenstruktur erzeugt.

3voto

Philippe Leybaert Punkte 161931

Was führt Sie zu der Annahme, dass die Daten an die URL angehängt werden?

Aber wäre es nicht sinnvoller, die Formularwerte in den Formulardaten selbst zu übergeben? So können Sie den Schritt "Explodieren" überspringen:

$("#addShowFormSubmit")
  .click(function() { 
      var perfTimes = $("#addShowForm").serialize(); 
      $.post("includes/add_show.php", 
         $.param({name: $("#showTitle").val()}) + "&" + perfTimes, 
         function(data) {...}); 
  });

2voto

Vassi Punkte 780

Dies ist wahrscheinlich ein bisschen stumpfsinnig, aber ich habe eine Funktion erstellt, die mir hilft, genau das zu tun, da ich es leid war, jedes Mal einen Haufen Korrekturen vorzunehmen. serializeArray ist irgendwie ärgerlich, weil es eine Sammlung von Objekten bereitstellt, während alles, was ich mit PhP rekonstruieren wollte, ein assoziatives Array war. Die folgende Funktion durchläuft das serialisierte Array und erstellt nur dann ein neues Objekt mit den entsprechenden Eigenschaften, wenn ein Wert vorhanden ist.

Erstens, die Funktion (sie nimmt die ID des betreffenden Formulars):

function wrapFormValues(form) { 
    form = "#" + form.attr("id") + " :input";
    form = $(form).serializeArray();
    var dataArray = new Object();

    for( index in form)
    {   
        if(form[index].value)   {
            dataArray[form[index].name] = form[index].value;    
        }
    }       

    return dataArray; 
}

Bei der Erstellung meiner Beiträge verwende ich in der Regel auch ein Objekt, da ich in der Regel zwei oder drei andere Werte vor den Formulardaten einfüge, und ich denke, das sieht sauberer aus als eine Inline-Definition, so dass der letzte Schritt wie folgt aussieht:

var payload = new Object(); 
//stringify requires json2.js from http://www.json.org/js.html
payload.data = JSON.stringify(data);

$.post("page.php", payload,  
    function(reply) {
        //deal with reply.
    });

Serverseitig müssen Sie nur Folgendes tun $payload = json_decode($_POST['data'], true) und schon haben Sie ein assoziatives Array, dessen Schlüssel die Namen Ihrer Formularfelder sind.

Vollständiger Haftungsausschluss obwohl, Mehrfachauswahlen wahrscheinlich nicht funktionieren hier, würden Sie wahrscheinlich nur erhalten, welcher Wert war zuletzt auf der Liste. Dies ist auch sehr speziell erstellt, um eines meiner Projekte zu passen, so können Sie es für Sie anpassen möchten. Ich verwende zum Beispiel json für alle meine Antworten vom Server.

0voto

Zacho Punkte 821

Versuchen Sie diese Syntax. Ich verwende sie, um ein Formular zu serialisieren und per Ajax-Aufruf an den WCF-Dienst zu senden. Sie können auch ein einzelnes JSON-Objekt zurücksenden, anstatt das Objekt so zu erstellen, wie Sie es tun. Versuchen Sie dies:

var serializedForm = serializedForm = $("#addShowForm").serializeArray();

$.post("includes/add_show.php", 
    {
        "myObjectName": ("#showTitle").val(), results: perfTimes 
    }, function(data) 
        {
            $("#addShowSuccess").empty()
            .slideDown("slow")
            .append(JSON.stringify(serializedForm)); 
        });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X