Преобразование объектов для использования в 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"