6.6 序列化元素

1 serialize() 方法

前例在讲解 $.get() 和 $.post() 方法时,表单的HTML如下:



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .comment { margin-top:10px; padding:10px; border:1px solid #ccc;background:#DDD;}
        .comment h6 { font-weight:700; font-size:14px;}
        .para { margin-top:5px; text-indent:2em;background:#DDD;}
    </style>
    <script src="jquery-3.2.1.min.js"></script>
</head>
<body>
    <form action="#" id="form1">
        <p>评论:</p>
        <p>姓名:<input type="text" name="username" id="username"></p>
        <p>内容:<textarea name="content" id="content" cols="20" rows="2"></textarea></p>
        <p><input type="button" id="send" value="提交"></p>
    </form>

    <div class="comment">已有评论:</div>
    <div id="resText"></div>

</body>
</html>



jquery序列化表单和反序列化_json

在进行编译之前。先写好 get.php 文件,并放在根目录



<?php 
    header("Content-Type:text/html; charset=utf-8");
    echo "<div class='comment'><h6>{$_REQUEST['username']}:</h6><p class='para'>{$_REQUEST['content']}</p></div>";
?>



jquery序列化表单和反序列化_json_02



$(function(){
        $("#send").click(function(){
            $.get("get1.php",{
                username : $("#username").val(),
                content  : $("#content").val()
            },function(data, textStatus){
                $("#resText").html(data);    //将返回的数据添加到页面上
            })
        })
    })



jquery序列化表单和反序列化_json_03

上述方法只适用于少量字段的表单,如果表单复杂的话,使用这种方式在增大工作量的同时也使表格缺乏弹性,jQuery 提供另一个简化方法  ----- serialize() 。能够将 DOM 元素内容序列化为字符串,用于 Ajax请求。(上例可修改为:)



$(function(){
       $("#send").click(function(){
            $.get("get1.php", $("#form1").serialize() , function (data, textStatus){
                        $("#resText").html(data); // 把返回的数据添加到页面上
                    }
            );
       })
    })





{
   username : $("#username").val(),
   content     : $("#content").val()        
}



还可以使用字符串方式



“username=”+encodeURIComponent($('#username').val() )
+"&content="+encodeURIComponent($('#content'),val() )



复选框和单选框都可以使用 serialize() 方法将值转化为字符串形式,只会将选中的值序列化。



$(":checkbox,:radio").serialize();



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .comment { margin-top:10px; padding:10px; border:1px solid #ccc;background:#DDD;}
        .comment h6 { font-weight:700; font-size:14px;}
        .para { margin-top:5px; text-indent:2em;background:#DDD;}
    </style>
    <script src="jquery-3.2.1.min.js"></script>
</head>
<body>
    <input type="checkbox" name="check" value="1" checked="checked"/>篮球<br/>
    <input type="checkbox" name="check" value="2" />足球<br/>
    <input type="checkbox" name="check" value="3" />乒乓球<br/>
    <input type="checkbox" name="check" value="4" />羽毛球<br/>


    <input type="radio" name="radio" value="1" checked="checked"/>篮球<br/>
    <input type="radio" name="radio" value="2" />足球<br/>
    <input type="radio" name="radio" value="3" />乒乓球<br/>
    <input type="radio" name="radio" value="4" />羽毛球<br/>


    <button id="send">提交</button>
<script>
    $(function(){
        $("#send").click(function(){
            var $data = $(":checkbox, :radio").serialize();
            alert($data);
        })
    })
</script>
</body>
</html>



点击会弹出已选中的项

jquery序列化表单和反序列化_jquery序列化表单和反序列化_04

 

2 serializeArray() 方法

该方法与 serialize() 类似,该方法不是返回字符串,而是将 DOM 元素序列化后,返回 JSON 格式数据

3 $.param() 方法

它是 serialize() 方法的核心,用来对一个数组或者对象按照 key/value 进行序列化。

下例将一个普通的对象序列化:



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="jquery-3.2.1.min.js"></script>
</head>
<body>

<script>
    $(function(){
        var obj  = {a:1,b:2};
        var   k  = $.param(obj);
        alert(k)
    })
</script>
</body>
</html>



jquery序列化表单和反序列化_jquery序列化表单和反序列化_05

6.7 jQuery 中的 Ajax 全局事件

jQuery 简化 Ajax 操作不仅体现在调用 Ajax 方法和处理响应方面,而且还体现在对调用 Ajax 方法的过程中的 HTTP 请求的控制,通过 jQ 提供了一些自定义全局函数,能够为各种与 Ajax 相关的事件注册回调函数。例如当 Ajax 请求开始时,会触发 ajaxStar() 方法的回调函数,当 Ajax 结束时,会触发 ajaxStop() 方法的回调函数,这些方法都是全局方法,因此无论创建它们的代码位于何处,只要有 ajax 请求发生,就会触发它们。

比如某页面图片加载比较慢,如果在加载过程中,不给用户提示一些反馈信息,很容易让客户失去耐心。此时,需要为网页添加一个提示信息,常用的提示信息为:“加载中......”



<div id="loading">加载中...</div>

<!--然后用 CSS 控制元素隐藏,当Ajax请求开始,将元素显示,用来提示用户 Ajax请求正在进行,当请求结束后,将元素隐藏-->

#loading{
    width:80px;
    height: 20px;
    background:#bbb;
    color:#000;
    display:none;
}

<script>

       $("#loading").ajaxStart(function(){
          $(this).show();
       });
       $("#loading").ajaxStop(function(){
          $(this).hide();
       });
</script>



♠ jQuery 的 Ajax 全局事件中还有几个方法,也可以带来方便

方法名称

说明

ajaxComplete(callback)

Ajax请求完成时执行的函数

ajaxError(callback)

Ajax请求发生错误时执行的函数,捕捉到的错误可以作为最后一个参数传递

ajaxSend(callback)

Ajax请求发送前执行的函数

ajaxSuccess(callback)

Ajax请求成功时执行的函数

♥ 如果想使某个 Ajax 请求不受全局方法的影响,那么可以在使用 $.ajax(options)方法时,将参数中的 global 设置为 false 。



$.ajax({
    url : "text.html",
    global : false   //不触发全局 Ajax 事件 
})