Jquery 系列化表单

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

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

 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对象。

下面是表单:

1 <form id="myForm" action="#">

2     <input name="name"/>

3     <input name="age"/>

4     <input type="submit"/>

5 </form>

 Jquery插件代码如下:

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

下面测试一下:

1 $("#myForm").bind("submit",function(e){

2         e.preventDefault();

3         console.log($(this).serializeJson());

4     });

测试结果:

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

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

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

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

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

测试如下:

表单:

 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"]}

此文章转载至:http://my249645546.iteye.com/blog/1617872

你可能感兴趣的:(jquery)