2010-12-15 57 views
7

的jQuery添加/推()值將Ajax POST jQuery中序列化()或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, ""))}; 

這是無效的,你不能在一次分配兩件事情,你要麼需要做的是這樣的:

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 2010-12-15 13:57:27

+1

@hoerf - 哦是的,這樣做:var arr = $('#form1')。serializeArray(); $ .merge(arr,$('#form2')。serializeArray());',那麼'arr'將包含兩個內容,只是將它用於'data'參數。 – 2010-12-15 14:01:38

1

您可以結合兩者的形式和serializeArray

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