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

 

我在网上看到有人用替换的方法,先用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();  
  •             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);  
  •  这里,我将多选的值封装为一个数值来进行处理。如果大家使用的时候需要将多选的值封装为“,"连接的字符串或者其他形式,请自行修改相应代码。

     

    测试如下:

    表单:

     

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

     

    相关文章:

    • 2021-11-30
    • 2022-12-23
    • 2021-07-31
    • 2022-01-24
    • 2021-08-08
    猜你喜欢
    • 2022-12-23
    • 2022-12-23
    • 2021-12-13
    • 2021-08-02
    相关资源
    相似解决方案