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

  • 相关阅读:
    [bzoj3261]最大异或和(可持久化trie)
    [luogu3384] 【模板】树链剖分
    [luogu3369]普通平衡树(替罪羊树模板)
    fhq-treap模板
    [luogu3391] 【模板】文艺平衡树(fhq-treap反转区间)
    [luogu3369]普通平衡树(fhq-treap模板)
    [luogu3369]普通平衡树(treap模板)
    [bzoj3223]文艺平衡树(splay区间反转模板)
    A Path Plan(2018黑龙江省赛)
    Abandoned Animal(BAPC2017 Preliminaries )
  • 原文地址:https://www.cnblogs.com/wuqun/p/3894139.html
Copyright © 2011-2022 走看看