2010-11-21 3 views
11

Как подготовить этот массив для $.ajax submit? Здесь изображения возвращают ["val1","val2"], но после того, как я использую $.param(images) я вернусь undefined=undefined&undefined=undefinedСериализация массива в JQuery?

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

Вообще идея заключается в том, чтобы проверить изображения для удаления на странице, то на кнопку мыши корыте петлевого все изображения проверены и сериализовать массив для отправить через Аякс скрипт php.

ответ

23

Вы не передаете массив в соответствующем формате до $.param. Из jQuery.param docs:

Если переданный объект находится в массиве, он должен быть массив объектов в формате возвращенного .serializeArray().

Массив должен быть массивом объектов, состоящих из пар имя/значение. Вы видите undefined=undefined&undefined=undefined, потому что "val1".name, "val1".value, "val2".name и "val2".value, все не определены. Это должно выглядеть примерно так:

[{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; 
}); 

Даже дождевик, однако, заключается в использовании .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; 
}); 
+1

Этот вопрос был для меня трудно понять, но с ответом и некоторые исследования мне удалось сделать что я хотел, СПАСИБО =) – Metafaniel

7

Смотрите docs for $.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() }); 
}); 
+0

Ваш ответ тоже помог мне, спасибо большое =) – Metafaniel

0

Я нахожу большую функцию, чтобы сделать это из другого вопроса https://stackoverflow.com/a/31751351/4110122

Эта функция возвращает массив пар ключ-значение

$.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);