2010-12-15 5 views
7

jQueryの追加/プッシュ()はjQueryでのAjax POSTに値シリアライズ()または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); 
      } 
    }); 
    }); 

[B]は非常にうまく機能-part。しかし、なぜ[a]パートは動作しませんか?これが押されていない。 ,{"name":"total","value": [..]

PHPの出力リレーをます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)

うまくいけば私問題/質問は明らかです。 最良の方法は何ですか? IDにはより良い方法がありますか?

答えて

26

それは次のようになります。あなたがアレイ上にプッシュしたい何

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

{name: "name", value: "value"}の形でオブジェクトである、それらは正しくエンコード/シリアル化されます。 [a](訂正された形式)は、[b]はプロパティエンコードされていないため、通常はより多く、オプション[b]よりも優れています。無効な文字が入力されたときに失敗します。この場合、追加されたコンテンツを管理しているので安全ですが、いつも動作するルートに進むことが最善です。data引数を直接文字列として作成しないでください。


[a]が動作しない理由については:

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

は、これは有効ではありません、あなたが一度に2つのことを割り当てることはできません、あなたはこのようにそれを行う必要があり、次のいずれか

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

又はこの(私の好ましい方法は、上記で使用される):

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

....または、このように、$.merge()(もう少し無駄な、しかしクリーナー探して)を使用します。

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

の両方を組み合わせることができ、それを組み合わせることが可能です$( '#form1')。serializeArray()と$( '#form2')。serializeArray()そしてそれをajax経由で送りますか? – hoerf

+1

@hoerf - そうです、これを行います: 'var arr = $( '#form1')。serializeArray(); $ .merge(arr、$( '#form2')。serializeArray()); 'ならば、' arr'は両方の内容を持ちます。 –

1

あなたはフォームやserializeArray

$('#frm1, #frm2').serializeArray() 
関連する問題