Добавление значений/push() в сообщение Ajax в jQuery serialize() или serializeArray()
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 выводится через 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 )
Надеюсь, моя проблема/вопрос ясен. Каков наилучший метод? Есть лучшие методы для so id?
2 ответов
это должно выглядеть так:
$('#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, ""))}]);