2010-12-15 13 views
7

jQueryAdición/push() Valores a Ajax POST en jQuery serialize() o 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); 
      } 
    }); 
    }); 

El [b] -parte funciona muy bien; sin embargo, ¿por qué no funciona la parte [a]? Esto no es empujado: ,{"name":"total","value": [..]

php Ouput través 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)

Espero que mi problema/pregunta es clara. ¿Cuál es el mejor método? Hay mejores métodos para ID?

Respuesta

26

Debe tener un aspecto como este:

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

Lo que se quiere impulsar en la matriz son los objetos en forma de {name: "name", value: "value"}, a continuación, van a ser serializado/codificado correctamente. La opción [a] (la forma corregida) es generalmente mucho mejor que la opción [b], ya que [b] no está codificado en la propiedad, y fallará en el momento en que se deslice cualquier carácter no válido para desordenar sus variables. En este caso, porque tiene el control del contenido adjunto, está a salvo ... pero lo mejor es seguir la ruta que siempre funciona: nunca se crea el argumento data como una cadena directamente.


En cuanto a la razón por la [a] no funciona:

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

Esto no es válida, no podrá asignar 2 cosas a la vez, ya sea que usted necesita para hacerlo de esta manera:

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

o este (mi método preferido, tal como se utiliza anteriormente):

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

.... o, utilizar $.merge() (un poco más derrochador, pero más limpio mirando), así:

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

¿Es posible combinar $ ('# form1'). serializeArray() y $ ('# form2'). serializeArray() y enviarlo a través de ajax? – hoerf

+1

@hoerf - oh sí, haz esto: 'var arr = $ ('# form1'). SerializeArray(); $ .merge (arr, $ ('# form2'). serializeArray()); ', luego' arr' tendrá el contenido de ambos, solo úsalo para tu argumento 'data'. –

1

Se pueden combinar las dos formas y serializeArray

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