Преобразование объектов для использования в url

jQuery.param() – преобразует объект, массив или массив объектов в строку, которая соответствует формату передачи данных через url.

jQuery.param( obj, traditional )
  • obj — объект, массив или массив объектов, которые будут преобразованы в строку.
  • traditional — логическое значение, определяющее следует ли рекурсивно проходить по массиву или объекту или нет.

Начиная с версии jQuery 1.4, метод $.param() рекурсивно сериализует сложные объекты для их дальнейшего использования в современных языках, таких как PHP и Ruby on Rails. Вы можете отключить данную возможность следующей командой: jQuery.ajaxSettings.traditional = true;

Начиная с версии jQuery 3.0, метод $.param() больше не использует jQuery.ajaxSettings.traditional как настройку по умолчанию и принимает значение false. Для лучшей совместимости различных версий вызовите $.param() с явным значением для второго параметра.

Если в качестве аргумента передаётся массив, то это должен быть массив объектов, обработанный методом .serializeArray()

[
  { name: "first", value: "Rick" },
  { name: "last", value: "Astley" },
  { name: "job", value: "Rock Star" }
]

Поскольку многие фрэймворки убрали возможность разбора сериализованных массивов, разработчики должны быть очень осторожны, когда передают параметр obj, содержащий массив или вложенные массивы

Поскольку на данный момент не существует универсальных спецификаций вида строки параметров, передача данных со сложной, вложенной структурой может работать по-разному для разных языков. До тех пор пока не будет ясных спецификаций, метод $.param будет работать так как сейчас.

Начиная с версии jQuery 1.4, так же поддерживается сериализация элементов HTML5. Выведем на экран строковое представление запроса объекта и в виде URI-декориовании следующим образом:

var myObject = {
  a: {
    one: 1,
    two: 2,
    three: 3
  },
  b: [ 1, 2, 3 ]
};
var recursiveEncoded = $.param( myObject );
var recursiveDecoded = decodeURIComponent( $.param( myObject ) );
 
alert( recursiveEncoded );
alert( recursiveDecoded );

Значение recursiveEncoded преобразуется в следующий вид:

a%5Bone%5D=1&a%5Btwo%5D=2&a%5Bthree%5D=3&b%5B%5D=1&b%5B%5D=2&b%5B%5D=3

А значение recursiveDecoded в:

a[one]=1&a[two]=2&a[three]=3&b[]=1&b[]=2&b[]=3

Для того чтобы заставить метод $.param() работать как в версии ниже чем jQuery 1.4, задайте параметру traditional значение true:

var myObject = {
  a: {
    one: 1,
    two: 2,
    three: 3
  },
  b: [ 1, 2, 3 ]
};
var shallowEncoded = $.param( myObject, true );
var shallowDecoded = decodeURIComponent( shallowEncoded );
 
alert( shallowEncoded );
alert( shallowDecoded );

Значение shallowEncoded преобразуется в следующий вид:

a=%5Bobject+Object%5D&b=1&b=2&b=3

А значение shallowDecoded в:

a=[object+Object]&b=1&b=2&b=3

Пример сериализации нескольких сложных объектов:

// <=1.3.2:
$.param({ a: [ 2, 3, 4 ] }); // "a=2&a=3&a=4"
// >=1.4:
$.param({ a: [ 2, 3, 4 ] }); // "a[]=2&a[]=3&a[]=4"
 
// <=1.3.2:
$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 } ] });
// "a=[object+Object]&d=3&d=4&d=[object+Object]"
 
// >=1.4:
$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 } ] });
// "a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5"

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *