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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章