Сериализация массива в JQuery?
Как подготовить этот массив для $.ajax
submit?
Здесь образы возвращаются ["val1","val2"]
, но после того, как я использую $.param(images)
, я вернусь undefined=undefined&undefined=undefined
$('#rem_images').click(function(){
var images = new Array();
$('.images_set_image input:checked').each(function(i){
images[i] = $(this).val();
});
alert($.param(images));
return false;
В общем, идея состоит в том, чтобы проверять изображения, которые нужно удалить на странице, а затем в цикле кликов по всем проверенным изображениям и сериализовать массив для отправки через ajax на php script.
Ответы
Ответ 1
Вы не передаете массив в правильном формате до $.param
. Из jQuery.param
docs:
Если переданный объект находится в массиве, он должен быть массивом объектов в формате, возвращаемом .serializeArray()
.
Массив должен быть массивом объектов, состоящих из пар имя/значение. Вы видите undefined=undefined&undefined=undefined
, потому что "val1".name
, "val1".value
, "val2".name
и "val2".value
- все undefined. Он должен выглядеть примерно так:
[{name: 'name1', value: 'val1'}, {name: 'name2', value: 'val2'}]
Итак, вы можете построить такой массив (если ваши флажки имеют атрибут name
):
$('#rem_images').click(function(){
var images = [];
$('.images_set_image input:checked').each(function(){
var $this = $(this);
images.push({name: $this.attr('name'), value: $this.val()});
});
alert($.param(images));
return false;
});
Однако даже slicker должен использовать .map()
(потому что функциональное программирование - это хороший материал):
$('#rem_images').click(function(){
var images = $('.images_set_image input:checked').map(function(){
var $this = $(this);
return {name: $this.attr('name'), value: $this.val()};
}).get();
alert($.param(images));
return false;
});
Ответ 2
Смотрите docs для $.param
:
Если переданный объект находится в массиве, он должен быть массивом объектов в формате, возвращаемом .serializeArray()
[{name:"first",value:"Rick"},
{name:"last",value:"Astley"},
{name:"job",value:"Rock Star"}]
Это означает, что вам нужно сгенерировать массив таким же образом:
$('.images_set_image input:checked').each(function(i){
images.push({ name: i, value: $(this).val() });
});
Ответ 3
Я нахожу отличную функцию, чтобы сделать это из другого вопроса
fooobar.com/info/41650/...
Эта функция возвращает массив с парами значений ключа
$.fn.serializeObject = function () {
var o = {};
var a = this.serializeArray();
$.each(a, function () {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
Чтобы использовать этот вызов:
var Form_Data = $('form').serializeObject();
console.log(Form_Data);