zoukankan      html  css  js  c++  java
  • jquery 之serializeArray() 提交表单

    serializeArray() 序列化表格元素 (类似 '.serialize()' 方法) 返回 JSON 数据结构数据。(摘自jquery文档)。

    有以下一个表单窗口,代码:

    <form action="" method="post" id="tf">
    <table width="100%" cellspacing="0" cellpadding="0" border="0">
    <tr>
    <th>姓名:</th>
    <td>
    <input type="text" id="txtUserName" name="UserName" />
    </td>
    <th>联系手机:</th>
    <td>
    <input type="text" name="Mobile" id="txtMobile" maxlength="11"/>
    </td>
    </tr>
    <tr>
    <td style=" text-align:center;" colspan="2">
    <input type="button" value=" 提 交 " style="padding-top:3px;" name="butsubmit" id="butsubmit"/>
    </td>
    </tr>
    </table>
    </form>

    JavaScript代码处理表单:

    <script>
    $(function () {
    $("#butsubmit").click(function(){
    var data = convertArray($("#tf").serializeArray());
    $.post(url, data, function (d) {},"json");
    });
    })
    function convertArray(o) { //主要是推荐这个函数。它将jquery系列化后的值转为name:value的形式。
    var v = {};
    for (var i in o) {
    if (typeof (v[o[i].name]) == 'undefined') v[o[i].name] = o[i].value;
    else v[o[i].name] += "," + o[i].value;
    }
    return v;
    }


    </script>

     

     

     

     

     

     

     

    这几天做一个Ajax像服务器动态提交的表单然后给出即时反馈.这些表单内容都是一系列的.内容大同小异.所以代码和页面结构也是大同小异.但是其中有一个页面使用AJAX始终无法提取到服务器值.反而将此页的整个render出来的页面显示出来.关键代码如下:

     


        $(document).ready(function() {
            $(
    "#Submit").click(function() {
                var a 
    = $("#aspnetForm").serialize();
    /*因为使用了masterpage,所以页面form的ID为aspnetForm*/
                $.ajax({
                  url: 
    "xxx.aspx",
                  type: 
    "get",
                  data: a,
                  success: function(data){
                    $(
    "#result").html(data);
                  }
                });
            });
        });
        

    后台代码简略如下.只是为了让大家明白意思:

     


        protected void Page_Load(object sender, EventArgs e)
        {
            
    if (Request.QueryString["length"!= null)
            {
                Response.Clear();
                Response.Write(
    "这里是回传的数据");
                Response.End();
            }
           
        }
     
     
     
     

    jQuery扩展 form序列化到json对象

    jQuery没有直接支持form到json的序列化方法,目前网上有一个实现是这样的

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $.fn.serializeObject = function() {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name]) {
                if (!o[this.name].push) {
                    o[this.name] = [ o[this.name] ];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    }

    这个function对于普通的对象转换是足够的,但是如果出现对象内部又包含子对象的情形就不能支持了。

    例如我有这样的一个form表单:

     

    1
    2
    3
    4
    5
    <form id="testform">
        <input type="text" name="name" value="dummyName" id="name">
        <input type="text" name="category.id" value="categoryId" id="name">
        <input type="text" name="category.name" value="categoryName" id="name">
    </form>

    对应到server端上的domain class是这样的:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public class DummyProduct {
         
        private DummyCategory category;
        private String name;
         
        public DummyCategory getCategory() {
            return category;
        }
     
        public void setCategory(DummyCategory category) {
            this.category = category;
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
         
    }
     
     
    public class DummyCategory {
        private String id;
        private String name;
     
        public String getId() {
            return id;
        }
     
        public void setId(String id) {
            this.id = id;
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
    }

     

     

    如果想把表单数据序列化成跟server端domain class匹配的json字符串,就可以使用我下面的这个扩展

     

    1
    /** @serializedParams looks like "prop1=value1&prop2=value2".  
    1
    Nested property like 'prop.subprop=value' is also supported **/
    1
    function paramString2obj (serializedParams) {
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
         
        var obj={};
        function evalThem (str) {
            var attributeName = str.split("=")[0];
            var attributeValue = str.split("=")[1];
            if(!attributeValue){
                return ;
            }
             
            var array = attributeName.split(".");
            for (var i = 1; i < array.length; i++) {
                var tmpArray = Array();
                tmpArray.push("obj");
                for (var j = 0; j < i; j++) {
                    tmpArray.push(array[j]);
                };
                var evalString = tmpArray.join(".");
                // alert(evalString);
                if(!eval(evalString)){
                    eval(evalString+"={};");               
                }
            };
         
            eval("obj."+attributeName+"='"+attributeValue+"';");
             
        };
     
        var properties = serializedParams.split("&");
        for (var i = 0; i < properties.length; i++) {
            evalThem(properties[i]);
        };
     
        return obj;
    }
     
     
    $.fn.form2json = function(){
        var serializedParams = this.serialize();
        var obj = paramString2obj(serializedParams);
        return JSON.stringify(obj);
    }

     

     

    使用起来大概像这个样子:

     

    1
    2
    var json = $("#testform").form2json();
    alert(json);

     

  • 相关阅读:
    xshell 缺少mfc110u.dll
    notepad++ 常用插件
    java 发送 http post 和 get 请求(利用unirest)
    my.conf配置大全
    md5算法
    sprinboot+redis
    jq下拉插件,chosen
    springboot+idea 热部署
    Jquery 监听浏览器前进后退
    手机自带的表情入库
  • 原文地址:https://www.cnblogs.com/fx2008/p/2284429.html
Copyright © 2011-2022 走看看