查看: 2152|回复: 0
打印 上一主题 下一主题

Jquery 将表单序列化为Json对象

[复制链接]
跳转到指定楼层
沙发
发表于 2015-3-30 12:18:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

  • /**  

  •      * 重置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对象。



下面是表单:


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

  •     <input name="name"/>  

  •     <input name="age"/>  

  •     <input type="submit"/>  

  • </form>  



Jquery插件代码如下:


  • (function($){  

  •         $.fn.serializeJson=function(){  

  •             var serializeObj={};  

  •             $(this.serializeArray()).each(function(){  

  •                 serializeObj[this.name]=this.value;  

  •             });  

  •             return serializeObj;  

  •         };  

  •     })(jQuery);  




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

  •     e.preventDefault();  

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

  • });  


测试结果:

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

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



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


  • (function($){  

  •         $.fn.serializeJson=function(){  

  •             var serializeObj={};  

  •             var array=this.serializeArray();  

  •             $(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);  


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


测试如下:

表单:


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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表