2010-12-15 59 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()