zoukankan      html  css  js  c++  java
  • 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"]}

  • 相关阅读:
    5、Hystrix服务熔断(服务端)与服务降级(客户端)
    迷宫回溯问题
    4、负载均衡:Ribbon、Feign
    PHP-删除排序数组中的重复项
    MYSQL-连续出现的数字
    PHP
    MYSQL分数排名
    MYSQL查询第二高的薪水
    PHP算法之有效的括号
    PHP算法之电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/hyl8218/p/3159178.html
Copyright © 2011-2022 走看看