Это должно выглядеть так:
$('#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, ""))}]);