1. 程式人生 > 實用技巧 >jQuery Ajax總結

jQuery Ajax總結

jQuery對Ajax的操作進行了封裝。jQuery中.ajax().ajax()屬於最底層的方法,這個放在後面說,首先看看封裝了.ajax()的方法。

load()方法

load()可以遠端載入HTML並插入到DOM中。結構為:

load(url [,data] [,callback])
  • url(String):服務端資源的url。
  • data(Obejct):傳送到伺服器的key/value資料
  • callback(Function):請求完成時(無論成功或失敗)的回撥函式,在響應資料已經載入到包裝集元素之後被呼叫。傳入這個函式的引數是響應文字、狀態碼、以及xhr例項。

載入HTML文件

首先構造一個要被load()方法載入的新聞評論頁面,comment.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>最新評論</title>
</head>
<body>
    <div class="comment">
        <p>
            <a href="#" class="username">張三</a>
            <span class="location">[北京市網友]</span>
        </p>

        <p class="contentTxt">一樓給度娘</p>
    </div>

    <div class="comment">
        <p>
            <a href="#" class="username">李四</a>
            <span class="location">[山東省濟南市網友]</span>
        </p>

        <p class="contentTxt">沒搶到沙發</p>
    </div>

    <div class="comment">
        <p>
            <a href="#" class="username">王五</a>
            <span class="location">[河南省鄭州市網友]</span>
        </p>

        <p class="contentTxt">頂頂頂頂頂</p>
    </div>
</body>
</html>

然後建立load.html,新增一個button按鈕觸發Ajax事件,將載入進來的HTML內容存放到id為“resText”的元素中。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="../jquery/jquery-2.2.3.js"></script>
    <script type="text/javascript">
        $(function () {
			// 點選按鈕,觸發載入動作
            $("#btn").click(function () {
				// 將comment.html載入進id為“resText”的元素裡
                $("#resText").load("comment.html");
            });
        })
    </script>
</head>
<body>
    <input type="button" id="btn" value="load評論">
    <div>最新評論:</div>
    <div id="resText"></div>
</body>
</html>

load()的url引數的語法結構為“url selector”,可以載入指定的內容。例如,載入comment.html頁面中class為“contentTxt”的內容:

$("#resText").load("comment.html .contentTxt");

load()的傳遞方式根據引數data來自動指定。如果沒有引數,則採用GET方式傳遞,否則,會自動轉換為POST方式。

回撥函式

在load方法中,無論ajax請求是否成功,請求完成(complete)後,回撥函式就會被觸發,對應$.ajax()中的complete回撥函式。

$("#resText").load("comment.html", function (responseText, textStatus, XMLHttpRequest) {
	alert(responseText);		// 請求返回的內容
    alert(textStatus);			// 請求狀態
    alert(XMLHttpRequest);		// XMLHttpRequest物件
});

load()常用來從web伺服器上獲取靜態的資料檔案。如果要向伺服器傳遞引數,可以使用.get().get()或.post()方法。

.get().get()與.post()

.get()使GETGETGET.get()使用GET進行非同步請求。伺服器的狀態和應用的模型資料不受GET操作的影響。無論進行多少次GET操作,返回的結果是完全一致的。.post()傳送到伺服器的資料可以用來修改應用的模型狀態。例如,可以新增或刪除資訊。

$.get()

$.get()結構為:

$.get(url [, data] [, callback] [, type])

$.get()引數說明:

  • url(String):請求的伺服器端資源的url
  • data(Object):以key/value的形式構造查詢字串追加到url
  • callback(Function):在請求成功(success)時被呼叫。將請求結果和狀態傳遞給該方法。
  • type(String):伺服器端返回內容的格式

HTML文件

下面新增評論的html頁面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="../jquery/jquery-2.2.3.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#send").click(function () {
                // 點選按鈕觸發get請求
                $.get("get1.jsp", {
                    // 向伺服器傳遞引數,encodeURI進行完整編碼
                    username: encodeURI($("#username").val()),
                    location: encodeURI($("#location").val()),
                    contentTxt: encodeURI($("#contentTxt").val())
                }, function (data, textStatus) {
                    // alert(textStatus);   // 返回請求狀態
                    // alert(decodeURI(data)); // 返回請求的狀態
					// 將返回的資料新增到id為“resText”的元素中
                    $("#resText").html(decodeURI(data));
                })
            });
        })
    </script>
</head>
<body>
<form id="form1">
    <p>新增評論:</p>

    <p>姓名:<input type="text" name="username" id="username"></p>

    <p>位置:<input type="text" name="location" id="location"></p>

    <p>內容:<textarea name="contentTxt" id="contentTxt"></textarea></p>

    <p><input type="button" id="send" value="提交"></p>

</form>
<div>最新評論:</div>
<div id="resText"></div>
</body>
</html>

接下來構造get1.jsp,模擬伺服器處理請求並返回資料:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
  String username = request.getParameter("username");
  String location = request.getParameter("location");
  String content = request.getParameter("contentTxt");

  out.println("<div class='comment'><a href='#' class='username'>" + username + "</a><span class='location'>"+ location +
	"</span></p><p class='contentTxt'>"+content+"</p></div>");
%>

然後需要將.jsp釋出到tomcat等web容器進行訪問。

JSON資料

相對於xml檔案而言,json相當簡潔、易讀。接下來看看伺服器返回json形式的資料的情況。

客戶端頁面get2.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script type="text/javascript" src="../jquery/jquery-2.2.3.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#send").click(function () {
                $.get("get2.jsp", {

                    username: encodeURI($("#username").val()),
                    location: encodeURI($("#location").val()),
                    contentTxt: encodeURI($("#contentTxt").val())
                }, function (data, textStatus) {
                    alert(textStatus);
                    var username = data.username;
                    var location = data.location;
                    var contentTxt = data.contentTxt;
                    username = decodeURI(username);
                    location = decodeURI(location);
                    contentTxt = decodeURI(contentTxt);
                    var txtHtml = "<div class='comment'><p><a href='#' class='username'>" + username +
                            "</a><span class='location'>" + location +
                            "</span></p><p class='contentTxt'>" + contentTxt + "</p></div>";
                    $("#resText").html(txtHtml);// 將返回的資料新增到頁面
                }, "json");
            })

        })
    </script>
</head>
<body>
<form id="form1">
    <p>新增評論:</p>

    <p>姓名:<input type="text" name="username" id="username"></p>

    <p>位置:<input type="text" name="location" id="location"></p>

    <p>內容:<textarea name="contentTxt" id="contentTxt"></textarea></p>

    <p><input type="button" id="send" value="get提交"></p>

</form>
<div>最新評論:</div>
<div id="resText"></div>
</body>
</html>

上面encodeURI()是用於編碼,否則中文就無法解析,這個希望以後有時間再總結,這裡先記住。回撥函式的第4個引數(type)設定為“json”,代表期待伺服器返回的資料格式。

需要新增json-lib.jar,用於構造json格式的資料。get2.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="net.sf.json.JSONObject" %>
<%
    String username = request.getParameter("username");
    String location = request.getParameter("location");
    String contentTxt = request.getParameter("contentTxt");
    JSONObject json = new JSONObject();
    json.put("username", username);
    json.put("location", location);
    json.put("contentTxt", contentTxt);

    out.println(json);

%>

json的格式非常嚴格,任何一個括號的不匹配或缺失都會導致頁面的指令碼終止執行。上面通過java程式碼首先建立了一個json物件。如果通過拼接的方式構造json資料,必須是標準的json格式:

out.println("{\"username\":\""+ username+ "\",\"location\":\"" + location + "\", \"contentTxt\":\""+ contentTxt+"\"  }");

$.post()

除了對伺服器的狀態和應用的模型資料的影響,.get().get()和.post()還有以下區別:

  • GET請求會將引數跟在url後進行傳遞,POST請求則作為HTTP訊息的實體內容傳送給Web伺服器。在ajax中這種區別對使用者是不可見的。
  • GET對傳輸的資料大小有限制(通常不大於2kb),使用POST方式傳遞的資料量比GET大得多(理論上不受限制)
  • GET方式請求的資料會被瀏覽器快取,這種情況可能帶來安全問題。

.get().get()和.post()的結構和使用方式都相同。

.getScript().getScript()和.getJson()

$.getScript()

$.getScript()用來載入.js檔案,與載入一個HTML片段一樣,js檔案會自動執行。

將$.load()的comment.html頁面改寫為js檔案,將評論新增到id為“resText”的元素中。js1.js:

var comments = [
    {
        "username": "張三",
        "location": "[北京市網友]",
        "contentTxt": "一樓獻度娘"
    },
    {
        "username": "李四",
        "location": "[山東省濟南市網友]",
        "contentTxt": "沒搶到沙發"
    },
    {
        "username": "王五",
        "location": "[河南省鄭州市網友]",
        "contentTxt": "頂頂頂頂頂"
    }
];

var html = '';

$.each(comments, function (index, comment) {
    html += "<div class='comment'><a href='#' class='username'>" + comment['username'] +
        "</a><span class='location'>" + comment['location'] +
        "</span></p><p class='contentTxt'>" + comment['contentTxt'] + "</p></div>";
});

$("#resText").html(html);

$.getScript()直接載入進js,並自動執行:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="../jquery/jquery-2.2.3.js"></script>
    <script type="text/javascript">
        $(function () {
			// 點選按鈕載入js1.js檔案
            $("#send").click(function () {
                $.getScript("js1.js");
            })
        })
    </script>
</head>
<body>

    <p>
        <input type="button" id="send" value="載入script">
    </p>

    <div class="comment">最新評論:</div>
    <div id="resText"></div>
</body>
</html>

$.getJSON()

.getJSON()JSON.getJSON()用於載入JSON檔案,用法與.getScript()相同。

json資料:

[
  {
    "username": "張三",
    "location": "[北京市網友]",
    "contentTxt": "一樓獻度娘"
  },
  {
    "username": "李四",
    "location": "[山東省濟南市網友]",
    "contentTxt": "沒搶到沙發"
  },
  {
    "username": "王五",
    "location": "[河南省鄭州市網友]",
    "contentTxt": "頂頂頂頂頂"
  }
]

jquery程式碼:

$(function () {
    $("#send").click(function () {
        $.getJSON("demo.json", function (data) {
            $("#resText").empty();
            var html = '';
            $.each(data, function (index, comment) {
                html += "<div class='comment'><a href='#' class='username'>" + comment['username'] +
                        "</a><span class='location'>" + comment['location'] +
                        "</span></p><p class='contentTxt'>" + comment['contentTxt'] + "</p></div>";
            });

            $("#resText").html(html);
        });
    })
});

$.ajax()方法

$.ajax()是jquery最底層的實現。

$.ajax(options)

這個方法只包含了1個引數,這個引數裡面包含了$.ajax()所需要的請求設定以及回撥函式,引數以key/value形式存在

$.ajax()引數說明:

  • url(String):傳送請求地址。

  • type(String):請求方式(POST或GET),預設為GET。其他HTTP請求方法如PUT、DELETE,僅部分瀏覽器支援。

  • data(Object或String):傳送到伺服器的資料。如果不是字串,將自動轉換為字串格式。GET請求中將附加在url後。物件必須是key/value格式,例如{id:"xxyh", password:"123456"}轉換為&id=xxyh&password=123456。如果是陣列,將自動為不同值對應同一個名稱。例如{name:["xxyh","dudu"]}轉換為&name=xxyh&name=dudu。

  • dataType(String):預期伺服器返回的資料型別。如果不指定,jquery將根據HTTP包MINE資訊返回responseXML或responseText,並作為回撥函式引數傳遞。可用型別:

    • xml:返回XML文件,可用jquery處理
    • html:返回純文字HTML資訊,包含的script標籤會插入DOM時執行。
    • script:返回純文字JavaScript程式碼。如果沒有設定cache引數,不會自動快取結果。在遠端請求時(不在同一個域下),所有POST請求都將轉為GET請求。
    • json:返回JSON資料。
    • jsonp:JSONP格式。使用JSONP形式呼叫函式時,例如myurl?callback=?,jquery將自動替換後一個“?”為正確的函式名,以執行回撥函式。
    • text:返回純文字字串。
  • complete(Function):請求完成後回撥函式(請求成功或失敗後均呼叫)。

    引數:XMLHttpRequest物件和一個描述成功請求型別的字串。

      function(XMLHttpRequest,textStatus){
      	this;	// 呼叫本次Ajax請求時傳遞的options引數
      }
    
  • success(Function):請求成功回撥函式。有2個引數:

    引數:由伺服器返回,並根據dataType引數進行處理後的資料描述狀態的字串

      function(data, textStatus) {
      	// data 可能是xmlDoc,jsonObj,html,text等
      	this;	// 呼叫本次Ajax請求時傳遞的options引數
      }
    
  • error(Function):請求失敗時被呼叫的函式。這個函式有3個引數,即XMLHttpRequest物件、錯誤資訊和捕獲的錯誤物件

      function(XMLHttpRequest, textStatus, errorThrown){
      	// 通常情況下textStatus和errorThrown只有一個包含資訊
      	this;	// 呼叫本次Ajax請求時傳遞的options引數
      }
    
  • contentType(String):當傳送資訊至伺服器時,內容編碼型別預設為"application/x-www-form-urlencoded"。

  • jsonp(String):在一個jsonp請求中重寫回調函式的名字。用來替代在“callback=?”這種GET或POST請求中URL引數裡的“callback”部分,例如{jsonp:'onJsonPLoad'}會導致將“onJsonPLoad=?”傳給伺服器。

獲取JSON資料

接下來通過$.ajax()獲取json資料。jquery程式碼:

$(function () {
    $("#send").click(function () {
        $.ajax({
            type:"GET",
            url:"demo.json",
            dataType:"json",
            success: function (data) {
                $("#resText").empty();
                var html = "";
                $.each(data, function (commentIndex, comment) {
                    html += "<div class='comment'><a href='#' class='username'>" + comment['username'] +
                            "</a><span class='location'>" + comment['location'] +
                            "</span></p><p class='contentTxt'>" + comment['contentTxt'] + "</p></div>";
                });
                $("#resText").html(html);
            }
        })
    });
})