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

  • 相关阅读:
    ZOJ 2158 Truck History
    Knight Moves (zoj 1091 poj2243)BFS
    poj 1270 Following Orders
    poj 2935 Basic Wall Maze (BFS)
    Holedox Moving (zoj 1361 poj 1324)bfs
    ZOJ 1083 Frame Stacking
    zoj 2193 Window Pains
    hdu1412{A} + {B}
    hdu2031进制转换
    openjudge最长单词
  • 原文地址:https://www.cnblogs.com/wuqun/p/3894139.html
Copyright © 2011-2022 走看看