2010-12-15 8 views
7

jQueryHinzufügen/push() Werte Ajax POST in jQuery Serialisieren() oder serializeArray()

$('#speichern').live('click' , function() { 
// [a] var data_save = $('#form_rechn').serializeArray(); 
    var data_save_ser = $('#form_rechn').serialize(); //[b] 
// [a] data_save[data_save.length] = {"name":"action","value":"save" },{"name":"total","value": Number($('#grandTotal').text().replace(/EUR/g, ""))}; 
    var addintional = 'action=save&mysql=update' + '&' + 'total=' + Number($('#grandTotal').text().replace(/EUR/g, ""));//[b] 
    var data_save = data_save_ser + '&' + addintional;//[b] 
    $.ajax({ 
    type : "POST", 
    cache : false, 
    url  : 'invoice_new_action.php', 
    data : data_save, 
    error:function (xhr, ajaxOptions, thrownError){ 
       alert(xhr.status); 
       alert(thrownError); 
    }, 
    success : function(data) { 
     $.fancybox(data); 
      } 
    }); 
    }); 

Die [b] -Teil sehr gut funktioniert; Warum funktioniert der [a] -Teil nicht? Dies ist nicht gedrückt: ,{"name":"total","value": [..]

php Ouput über print_r ($ _POST)

[b] -Version

Array ([pnr_item_1] => 1 [pkt_item_1] => HostingXXL [desc_item_1] => 20GB, 1x.de [qty_item_1] => 4 [price_item_1] => 15.5 .... [action] => save [mysql] => update [total] => 62)

[a] -Version

Array ([pnr_item_1] => 1 [pkt_item_1] => HostingXXL [desc_item_1] => 20GB, 1x.de [qty_item_1] => 4 [price_item_1] => 15.5 .... [action] => save)

Hoffentlich mein Problem/Frage ist klar. Was ist die beste Methode? Es gibt bessere Methoden, um so ID?

Antwort

26

Es sollte wie folgt aussehen:

$('#speichern').live('click' , function() { 
    var data_save = $('#form_rechn').serializeArray(); 
    data_save.push({ name: "action", value: "save" }); 
    data_save.push({ name: "mysql", value: "update" }); 
    data_save.push({ name: "total", value: Number($('#grandTotal').text().replace(/EUR/g, "")) }); 
    $.ajax({ 
     type : "POST", 
     cache : false, 
     url  : 'invoice_new_action.php', 
     data : data_save, 
     error : function (xhr, ajaxOptions, thrownError){ 
     alert(xhr.status); 
     alert(thrownError); 
     }, 
     success : function(data) { 
     $.fancybox(data); 
     } 
    }); 
}); 

Was Sie auf das Array schieben wollen, sind Objekte in Form von {name: "name", value: "value"}, dann werden sie serialisiert/codiert werden korrekt. Option [a] (die korrigierte Form davon) ist in der Regel viel besser als die Option [b], da [b] nicht Eigenschaft codiert ist, und wird fehlschlagen, sobald ein ungültiges Zeichen dort hinein rutscht, um Ihre Variablen zu vermasseln. In diesem Fall, weil Sie den angehängten Inhalt unter Kontrolle haben, sind Sie sicher ... aber es ist am besten, die Route zu wählen, die immer funktioniert: Erstellen Sie niemals Ihr data-Argument direkt als String.


wie für die, warum [a] nicht funktioniert:

data_save[data_save.length] = {"name":"action","value":"save" },{"name":"total","value": Number($('#grandTotal').text().replace(/EUR/g, ""))}; 

Diese nicht gültig ist, können Sie zwei Dinge auf einmal nicht abtreten, müssen Sie entweder es wie dies zu tun:

data_save[data_save.length] = {"name":"action","value":"save" }; 
data_save[data_save.length] = {"name":"total","value": Number($('#grandTotal').text().replace(/EUR/g, ""))}; 

oder dieses (mein bevorzugtes Verfahren, wie es oben verwendet):

data_save.push({"name":"action","value":"save" }); 
data_save.push({"name":"total","value": Number($('#grandTotal').text().replace(/EUR/g, ""))}); 

.... oder verwenden $.merge() (etwas verschwenderisch, aber sauberer suchen), wie folgt aus:

$.merge(data_save, [{"name":"action","value":"save" }, {"name":"total","value": Number($('#grandTotal').text().replace(/EUR/g, ""))}]); 
+0

Ist es möglich, zu kombinieren $ ('# form1'). serializeArray() und $ ('# form2'). serializeArray() und senden Sie es über Ajax? – hoerf

+1

@hoerf - oh ja, tu das: 'var arr = $ ('# form1') serializeArray(); $ .merge (arr, $ ('# form2'). serializeArray()); ', dann wird 'arr' den Inhalt von beiden haben, benutze es einfach für dein' data' Argument. –

1

Sie sowohl die Formen und serializeArray kombinieren

$('#frm1, #frm2').serializeArray()