100 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @author Kyle Florence <kyle[dot]florence[at]gmail[dot]com>
 | |
|  * @website https://github.com/kflorence/jquery-deserialize/
 | |
|  * @version 1.1.0
 | |
|  *
 | |
|  * Dual licensed under the MIT and GPLv2 licenses.
 | |
|  */
 | |
| 
 | |
| (function( jQuery ) {
 | |
| 
 | |
| var push = Array.prototype.push,
 | |
| 	rcheck = /^(radio|checkbox)$/i,
 | |
| 	rselect = /^(option|select-one|select-multiple)$/i,
 | |
| 	rvalue = /^(hidden|text|search|tel|url|email|password|datetime|date|month|week|time|datetime-local|number|range|color|submit|image|reset|button|textarea)$/i;
 | |
| 
 | |
| jQuery.fn.extend({
 | |
| 	deserialize: function( data, callback ) {
 | |
| 		if ( !this.length || !data ) {
 | |
| 			return this;
 | |
| 		}
 | |
| 
 | |
| 		var i, length,
 | |
| 			elements = this[ 0 ].elements || this.find( ":input" ).get(),
 | |
| 			normalized = [];
 | |
| 
 | |
| 		if ( !elements ) {
 | |
| 			return this;
 | |
| 		}
 | |
| 
 | |
| 		if ( jQuery.isArray( data ) ) {
 | |
| 			normalized = data;
 | |
| 		} else if ( jQuery.isPlainObject( data ) ) {
 | |
| 			var key, value;
 | |
| 
 | |
| 			for ( key in data ) {
 | |
| 				jQuery.isArray( value = data[ key ] ) ?
 | |
| 					push.apply( normalized, jQuery.map( value, function( v ) {
 | |
| 						return { name: key, value: v };
 | |
| 					})) : push.call( normalized, { name: key, value: value } );
 | |
| 			}
 | |
| 		} else if ( typeof data === "string" ) {
 | |
| 			var parts;
 | |
| 
 | |
| 			data = decodeURIComponent( data ).split( "&" );
 | |
| 
 | |
| 			for ( i = 0, length = data.length; i < length; i++ ) {
 | |
| 				parts = data[ i ].split( "=" );
 | |
| 				push.call( normalized, { name: parts[ 0 ], value: parts[ 1 ] } );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( !( length = normalized.length ) ) {
 | |
| 			return this;
 | |
| 		}
 | |
| 
 | |
| 		var current, element, item, j, len, property, type;
 | |
| 
 | |
| 		for ( i = 0; i < length; i++ ) {
 | |
| 			current = normalized[ i ];
 | |
| 
 | |
| 			if ( !( element = elements[ current.name ] ) ) {
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			type = ( len = element.length ) ? element[ 0 ] : element;
 | |
| 			type = type.type || type.nodeName;
 | |
| 			property = null;
 | |
| 
 | |
| 			if ( rvalue.test( type ) ) {
 | |
| 				property = "value";
 | |
| 			} else if ( rcheck.test( type ) ) {
 | |
| 				property = "checked";
 | |
| 			} else if ( rselect.test( type ) ) {
 | |
| 				property = "selected";
 | |
| 			}
 | |
| 
 | |
| 			// Handle element group
 | |
| 			if ( len ) {
 | |
| 				for ( j = 0; j < len; j++ ) {
 | |
| 					item = element [ j ];
 | |
| 
 | |
| 					if ( item.value == current.value ) {
 | |
| 						item[ property ] = true;
 | |
| 					}
 | |
| 				}
 | |
| 			} else {
 | |
| 				element[ property ] = current.value;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( jQuery.isFunction( callback ) ) {
 | |
| 			callback.call( this );
 | |
| 		}
 | |
| 
 | |
| 		return this;
 | |
| 	}
 | |
| });
 | |
| 
 | |
| })( jQuery );
 |