Jquery 将表单序列化为Json对象

大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法。不过,我们可以写一个插件实现。

 

我在网上看到有人用替换的方法,先用serialize序列化后,将&替换成“:”、“‘”:

Js代码 复制代码 收藏代码
  1. /**
  2. * 重置form表单
  3. * @param formId form的id
  4. */
  5. function resetQuery(formId){
  6. var fid = "#" + formId;
  7. var str = $(fid).serialize();
  8. //str= cardSelectDate=3&startdate=2012-02-01&enddate=2012-02-04
  9. var ob= strToObj(str);
  10. alert(ob.startdate); //2012-02-01
  11. }
  12. function strToObj(str){
  13. str = str.replace(/&/g, "','" );
  14. str = str.replace(/=/g, "':'" );
  15. str = "({'" +str + "'})" ;
  16. obj = eval(str);
  17. return obj;
  18. }
/** 
     * 重置form表单 
     * @param formId  form的id  
     */  
    function resetQuery(formId){  
        var fid = "#" + formId;  
        var str = $(fid).serialize();  
        //str= cardSelectDate=3&startdate=2012-02-01&enddate=2012-02-04  
        var ob= strToObj(str);  
        alert(ob.startdate);//2012-02-01  
    }  
      
    function strToObj(str){  
        str = str.replace(/&/g,"','");  
        str = str.replace(/=/g,"':'");  
        str = "({'"+str +"'})";  
        obj = eval(str);   
        return obj;  
    }  

个人感觉这样做有bug。

 

我的方法是,先用serializeArray序列化为数组,再封装为Json对象。

 

 

下面是表单:

 

Html代码 复制代码 收藏代码
  1. < form id = "myForm" action = "#" >
  2. < input name = "name" />
  3. < input name = "age" />
  4. < input type = "submit" />
  5. </ form >
<form id="myForm" action="#">
	<input name="name"/>
	<input name="age"/>
	<input type="submit"/>
</form>

 

Jquery插件代码如下:

 

Js代码 复制代码 收藏代码
  1. ( function ($){
  2. $.fn.serializeJson= function (){
  3. var serializeObj={};
  4. $( this .serializeArray()).each( function (){
  5. serializeObj[ this .name]= this .value;
  6. });
  7. return serializeObj;
  8. };
  9. })(jQuery);
(function($){
		$.fn.serializeJson=function(){
			var serializeObj={};
			$(this.serializeArray()).each(function(){
				serializeObj[this.name]=this.value;
			});
			return serializeObj;
		};
	})(jQuery);

 

 

下面测试一下:$("#myForm").bind("submit",function(e){

Js代码 复制代码 收藏代码
  1. e.preventDefault();
  2. console.log($( this ).serializeJson());
  3. });
		e.preventDefault();
		console.log($(this).serializeJson());
	});

测试结果:

输入a,b提交,得到序列化结果

{age: "b",name: "a"}

 

 

上面的插件,不能适用于有多个值的输入控件,例如复选框、多选的select。下面,我将插件做进一步的修改,让其支持多选。代码如下:

 

Js代码 复制代码 收藏代码
  1. ( function ($){
  2. $.fn.serializeJson= function (){
  3. var serializeObj={};
  4. var array= this .serializeArray();
  5. var str= this .serialize();
  6. $(array).each( function (){
  7. if (serializeObj[ this .name]){
  8. if ($.isArray(serializeObj[ this .name])){
  9. serializeObj[ this .name].push( this .value);
  10. } else {
  11. serializeObj[ this .name]=[serializeObj[ this .name], this .value];
  12. }
  13. } else {
  14. serializeObj[ this .name]= this .value;
  15. }
  16. });
  17. return serializeObj;
  18. };
  19. })(jQuery);
(function($){
		$.fn.serializeJson=function(){
			var serializeObj={};
			var array=this.serializeArray();
			var str=this.serialize();
			$(array).each(function(){
				if(serializeObj[this.name]){
					if($.isArray(serializeObj[this.name])){
						serializeObj[this.name].push(this.value);
					}else{
						serializeObj[this.name]=[serializeObj[this.name],this.value];
					}
				}else{
					serializeObj[this.name]=this.value;	
				}
			});
			return serializeObj;
		};
	})(jQuery);

这里,我将多选的值封装为一个数值来进行处理。如果大家使用的时候需要将多选的值封装为“,"连接的字符串或者其他形式,请自行修改相应代码。

 

测试如下:

表单:

 

Html代码 复制代码 收藏代码
  1. < form id = "myForm" action = "#" >
  2. < input name = "name" />
  3. < input name = "age" />
  4. < select multiple = "multiple" name = "interest" size = "2" >
  5. < option value = "interest1" > interest1 </ option >
  6. < option value = "interest2" > interest2 </ option >
  7. < option value = "interest3" > interest3 </ option >
  8. < option value = "interest4" > interest4 </ option >
  9. </ select >
  10. < input type = "checkbox" name = "vehicle" value = "Bike" /> I have a bike
  11. < input type = "checkbox" name = "vehicle" value = "Car" /> I have a car
  12. < input type = "submit" />
  13. </ form >
<form id="myForm" action="#">
	<input name="name"/>
	<input name="age"/>
	<select multiple="multiple" name="interest" size="2">
		<option value ="interest1">interest1</option>
		<option value ="interest2">interest2</option>
		<option value="interest3">interest3</option>
		<option value="interest4">interest4</option>
	</select>
	<input type="checkbox" name="vehicle" value="Bike" /> I have a bike
	<input type="checkbox" name="vehicle" value="Car" /> I have a car
	<input type="submit"/>
</form>

测试结果:

{age: "aa",interest: ["interest2", "interest4"],name: "dd",vehicle:["Bike","Car"]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值