美文网首页
jQuery序列化表单相关

jQuery序列化表单相关

作者: 我叫397 | 来源:发表于2020-07-16 14:52 被阅读0次

    划水摸鱼的时候研究了jq表单序列化的3种方式,分别是serialize()、serializeArray()、FormData(),在此分享一下!
    首先抛出公共的代码部分,如下:

    /***** CSS *****/
    <style>
        *{
            font-family: 微软雅黑;
        }
        .left{
            float: left;
        }
        .right{
            margin-left: 100px;
            display: inline-block;
        }
        .right textarea{
            width: 300px;
            height: 300px;
            font-size: 16px;
        }
    </style>
    
    /***** HTML *****/
    <div class="left">
        <form id="personInfo">
            <p>
                <label>姓名:</label>
                <input type="text" name="userName">
            </p>
            <p>
                <label>性别:</label>
                <label><input type="radio" name="sex" value="male">男</label>
                <label><input type="radio" name="sex" value="female">女</label>
            </p>
            <p>
                <label>照片:</label>
                <input type="file" name="photo" accept="image/*">
            </p>
            <p>
                <label>籍贯:</label>
                <input type="text" name="nativePlace">
            </p>
            <p>
                <label>所属部门:</label>
                <input type="text" name="department">
            </p>
            <p>
                <label>联系电话:</label>
                <input type="text" name="phone">
            </p>
            <p>
                <label>入职时间:</label>
                <input type="date" name="entryTime">
            </p>
            <button type="button" onclick="saveInfo()">提交</button>
        </form>
    </div>
    <div class="right">
        <p>结果:</p>
        <textarea></textarea>
    </div>
    
    /***** 引用的JS *****/
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.1/jquery.min.js"></script>
    

    serialize():

    /***** 主要的JS代码 *****/
    <script>
        function saveInfo(){
            var personInfo = $("#personInfo").serialize();
            $(".right textarea").html(personInfo);
        }
    </script>
    
    /***** 输出的字符串 *****/
    userName=%E5%BC%A0%E4%B8%89&sex=male&nativePlace=%E9%99%95%E8%A5%BF%E8%A5%BF%E5%AE%89&department=%E6%8A%80%E6%9C%AF%E7%A0%94%E5%8F%91%E9%83%A8&phone=1234567890&entryTime=2020-07-02
    
    输出结果

    可以看出:
    1.取得的字符串中的中文已被编码
    2.无法取得照片

    /***** 改写后的JS代码 *****/
    <script>
        function saveInfo(){
            //默认serialize()方法会编码中文
            var personInfo = $("#personInfo").serialize();
            //将编码的中文解码
            var params = decodeURIComponent(personInfo, true);
            $(".right textarea").html(params);
        }
    </script>
    
    /***** 输出的字符串 *****/
    userName=张三&sex=male&nativePlace=陕西西安&department=技术研发部&phone=1234567890&entryTime=2020-07-02
    

    小结:serialize()方法序列化表单依赖于input的name属性;默认会编码中文;无法序列化文件输入框

    serializeArray():

    /***** 主要的JS代码 *****/
    <script>
        function saveInfo(){
            var personArr = $("#personInfo").serializeArray();
            //将取得的数组对象转成字符串
            var params = JSON.stringify(personArr);
            $(".right textarea").html(params);
        }
    </script>
    
    /***** 输出的字符串 *****/
    [{"name":"userName","value":"张三"},{"name":"sex","value":"male"},{"name":"nativePlace","value":"陕西西安"},{"name":"department","value":"技术研发部"},{"name":"phone","value":"1234567890"},{"name":"entryTime","value":"2020-07-02"}]
    
    输出结果

    可以看出:
    1.取得的是对象数组
    2.无法取得照片

    /***** 改写后的JS代码 *****/
    <script>
        function saveInfo(){
            var personObj = {};
            var personArr = $("#personInfo").serializeArray();
            //组合成新对象
            $.each(personArr, function(i, item){
                personObj[item.name] = item.value;
            });
            //将得到的对象转成字符串
            var params = JSON.stringify(personObj);
            $(".right textarea").html(params);
        }
    </script>
    
    /***** 输出的字符串 *****/
    {"userName":"张三","sex":"male","nativePlace":"陕西西安","department":"技术研发部","phone":"1234567890","entryTime":"2020-07-02"}
    

    小结:serializeArray()方法序列化表单依赖于input的name属性;默认序列化得到的是对象数组;无法序列化文件输入框

    FormData():

    注意:FormData()序列化表单依赖于input的name属性,可将整个表单中的输入数据POST到后台,包括输入框的值和文件

    /***** 主要的JS代码 *****/
    <script>
        function saveInfo(){
            var formData = new FormData($("#personInfo")[0]);
            $.ajax({                
                url: "/Main/AddPersonInfo?Rdm=" + Math.floor(Math.random() * 1000),
                type: "POST",
                dataType: "json",
                async: true,
                cache: false,
                contentType: false, //必要条件
                processData: false, //必要条件
                data: formData,
                success: function (data) {
                    //do something
                },
                complete: function (XHR, TS) {
                    XHR = null
                },
                error: function (e) {
                    alert("服务器太累啦,需要喘口气呢~")
                }
            }); 
        }
    </script>
    
    /***** C#取表单中的值 *****/
    string userName = Request.Form["userName"];
    HttpPostedFileBase File = Request.Files["photo"];
    

    FormData()的其他方法:

    //通过FormData构造函数创建一个空对象
    var formData = new FormData();
    
    //1.通过append(key, value)在数据末尾追加数据
    formData.append("userName", "liujiao");
    formData.append("userName", "zhangsan");
    
    //2.通过get(key)与getAll(key)来获取相对应的值
    formData.get("userName"); //获取key为userName的第一个值
    formData.getAll("userName"); //获取key为userName的所有值,返回值为数组类型
    
    //3.通过set(key, value)来设置修改数据
    formData.set("userName", "lisi"); //key值不存在,会添加一条数据;key值存在,会修改对应的value值
    
    //4.通过has(key)来判断是否存在对应的key
    formData.has("userName"); //返回值为true或false
    
    //5.通过delete(key)可以删除数据
    formdata.delete("userName");
    

    相关参考:点击前往

    相关文章

      网友评论

          本文标题:jQuery序列化表单相关

          本文链接:https://www.haomeiwen.com/subject/fmmphktx.html