Jquery 将表单序列化为Json对象

来源:互联网 发布:mac显示网络图标 编辑:程序博客网 时间:2024/05/21 08:52

大家知道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.        
  13.     function strToObj(str){   
  14.         str = str.replace(/&/g,"','");   
  15.         str = str.replace(/=/g,"':'");   
  16.         str = "({'"+str +"'})";   
  17.         obj = eval(str);    
  18.         return obj;   
  19.     }   

个人感觉这样做有bug。

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

下面是表单:

Html代码  收藏代码
  1. <form id="myForm" action="#"> 
  2.     <input name="name"/> 
  3.     <input name="age"/> 
  4.     <input type="submit"/> 
  5. </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); 

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

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

测试结果:

输入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); 

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

测试如下:

表单:

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> 

测试结果:

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

 

0 0