Блог веб-программиста

25Июн/090

jQuery Serialize — PHP like serialize function for jQuery

ENG: I've addapted a JavaScript serialize function by Kevin van Zonneveld to jQuery. Function works like the same named function in PHP. Be free to use it in your projects. It is especially needed when you want to post Object in AJAX (in jQuery "$.ajax()").
RUS: Я адаптировал JavaScript serialize функцию, написанную Kevin van Zonneveld, для использования с jQuery. Serialize работает также как и одноименная функция в PHP. Она хорошо выручит Вас, если Вы захотите передать в AJAX запросе Объект (JavaScript object).

Example of using: $.serialize({data: 'value'});

Source code(UPDATE-1):

jQuery.extend({
 serialize: function ( mixed_value ) {
 // Returns a string representation of variable (which can later be unserialized)
 //
 // version: 906.1807
 // discuss at: http://phpjs.org/functions/serialize
 // +   original by: Arpad Ray (mailto:arpad@php.net)
 // +   improved by: Dino
 // +   bugfixed by: Andrej Pavlovic
 // +   bugfixed by: Garagoth
 // +      input by: DtTvB (http://dt.in.th/2008-09-16.string-length-in-bytes.html)
 // +   bugfixed by: Russell Walker (http://www.nbill.co.uk/)
 // %          note: We feel the main purpose of this function should be to ease the transport of data between php & js
 // %          note: Aiming for PHP-compatibility, we have to translate objects to arrays
 // *     example 1: serialize(['Kevin', 'van', 'Zonneveld']);
 // *     returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
 // *     example 2: serialize({firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'});
 // *     returns 2: 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'
 var _getType = function( inp ) {
 var type = typeof inp, match;
 var key;
 if (type == 'object' && !inp) {
 return 'null';
 }
 if (type == "object") {
 if (!inp.constructor) {
 return 'object';
 }
 var cons = inp.constructor.toString();
 match = cons.match(/(\w+)\(/);
 if (match) {
 cons = match[1].toLowerCase();
 }
 var types = ["boolean", "number", "string", "array"];
 for (key in types) {
 if (cons == types[key]) {
 type = types[key];
 break;
 }
 }
 }
 return type;
 };
 var type = _getType(mixed_value);
 var val, ktype = '';
 
switch (type) {
 case "function":
 val = "";
 break;
 case "boolean":
 val = "b:" + (mixed_value ? "1" : "0");
 break;
 case "number":
 val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
 break;
 case "string":
 val = "s:" + encodeURIComponent(mixed_value).replace(/%../g, 'x').length + ":\"" + mixed_value + "\"";
 break;
 case "array":
 case "object":
 val = "a";
 /*
 if (type == "object") {
 var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);
 if (objname == undefined) {
 return;
 }
 objname[1] = serialize(objname[1]);
 val = "O" + objname[1].substring(1, objname[1].length - 1);
 }
 */
 var count = 0;
 var vals = "";
 var okey;
 var key;
 for (key in mixed_value) {
 ktype = _getType(mixed_value[key]);
 if (ktype == "function") {
 continue;
 }
 
okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
 vals += $.serialize(okey) +
 $.serialize(mixed_value[key]);
 count++;
 }
 val += ":" + count + ":{" + vals + "}";
 break;
 case "undefined": // Fall-through
 default: // if the JS object has a property which contains a null value, the string cannot be unserialized by PHP
 val = "N";
 break;
 }
 if (type != "object" && type != "array") {
 val += ";";
 }
 return val;
 }
 });

UPDATES:
#1 - Patched version for working correctly with null, undefined values, subobjects.

NJoy

Связано с категорией: Code Оставить комментарий
Комментарии (0) Пинги (0)

Пока нет комментариев.


Leave a comment

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Нет обратных ссылок на эту запись.