Добавление значений / push () к Ajax POST в jQuery serialize () или serializeArray () - PullRequest
7 голосов
/ 15 декабря 2010

JQuery

$('#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] -часть работает очень хорошо; однако почему не работает [a] -часть? Это не выдвигается: ,{"name":"total","value": [..]

php Ouput через print_r ($ _POST)

[b] -версия

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] -версия

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 )

Надеюсь, моя проблема / вопрос понятна. Какой метод самый лучший? Есть лучшие методы, чтобы идентифицировать?

Ответы [ 2 ]

28 голосов
/ 15 декабря 2010

Это должно выглядеть так:

$('#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, ""))}]);
2 голосов
/ 28 сентября 2011

Вы можете комбинировать как формы, так и serializeArray

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