jQuery中關于Ajax的詳解
Ajax讓用戶頁面豐富起來, 增強用戶體驗. Ajax是所有Web開發(fā)的必修課. 雖然Ajax技術并不復雜, 但是實現(xiàn)方式還是會因為每個開發(fā)人員而有所差異.jQuery提供一系列Ajax函數(shù)來幫助我們統(tǒng)一這種差異, 并且讓調(diào)用Ajax更加簡單.jQuery提供了幾個用于發(fā)送Ajax請求的函數(shù). 其中最核心也是最復雜的是jQuery.ajax(),所有的其他Ajax函數(shù)都是它的一個簡化調(diào)用.當我們想要完全控制Ajax時可以使用此結(jié)果, 否則還是使用簡化方法如get, post, load等更加方便. 所以jQuery.ajax( options ) 方法放到***一個介紹. 先來介紹最簡單的load方法:
1. load( url, [data], [callback] )
Returns: jQuery包裝集說明
load方法能夠載入遠程 HTML 文件代碼并插入至 DOM 中。
默認使用 GET 方式, 如果傳遞了data參數(shù)則使用Post方式.
傳遞附加參數(shù)時自動轉(zhuǎn)換為 POST 方式。jQuery 1.2 中,可以指定選擇符,來篩選載入的 HTML 文檔,DOM 中將僅插入篩選出的 HTML 代碼。語法形如 "url #some > selector", 默認的選擇器是"body>*".
講解:
load是最簡單的Ajax函數(shù), 但是使用具有局限性:
它主要用于直接返回HTML的Ajax接口
load是一個jQuery包裝集方法,需要在jQuery包裝集上調(diào)用,并且會將返回的HTML加載到對象中, 即使設置了回調(diào)函數(shù)也還是會加載。
不過不可否認load接口設計巧妙并且使用簡單.下面通過示例來演示Load接口的使用:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>jQuery Ajax - Load</title>
- <script type="text/javascript" src="../scripts/jquery-1.3.2-vsdoc2.js"></script>
- <script type="text/javascript">
- $(function()
- {
- $("#btnAjaxGet").click(function(event)
- {
- //發(fā)送Get請求
- $("#divResult").load("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click" + "×tamp=" + (new Date()).getTime());
- });
- $("#btnAjaxPost").click(function(event)
- {
- //發(fā)送Post請求
- $("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxPost_click" });
- });
- $("#btnAjaxCallBack").click(function(event)
- {
- //發(fā)送Post請求, 返回后執(zhí)行回調(diào)函數(shù).
- $("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxCallBack_click" }, function(responseText, textStatus, XMLHttpRequest)
- {
- responseText = " Add in the CallBack Function! <br/>" + responseText
- $("#divResult").html(responseText); //或者: $(this).html(responseText);
- });
- });
- $("#btnAjaxFiltHtml").click(function(event)
- {
- //發(fā)送Get請求, 從結(jié)果中過濾掉 "鞍山" 這一項
- $("#divResult").load("../data/AjaxGetCityInfo.aspx?resultType=html" + "×tamp=" + (new Date()).getTime() + " ul>li:not(:contains('鞍山'))");
- });
- })
- </script>
- </head>
- <body>
- <button id="btnAjaxGet">使用Load執(zhí)行Get請求</button><br />
- <button id="btnAjaxPost">使用Load執(zhí)行Post請求</button><br />
- <button id="btnAjaxCallBack">使用帶有回調(diào)函數(shù)的Load方法</button><br />
- <button id="btnAjaxFiltHtml">使用selector過濾返回的HTML內(nèi)容</button>
- <br />
- <div id="divResult"></div>
- </body>
- </html>
提示:我們要時刻注意瀏覽器緩存, 當使用GET方式時要添加時間戳參數(shù) (net Date()).getTime() 來保證每次發(fā)送的URL不同, 可以避免瀏覽器緩存.
提示: 當在url參數(shù)后面添加了一個空格, 比如" "的時候, 會出現(xiàn)"無法識別符號"的錯誤, 請求還是能正常發(fā)送. 但是無法加載HTML到DOM. 刪除后問題解決.
2.jQuery.get( url, [data], [callback], [type] )
Returns: XMLHttpRequest說明:
通過遠程 HTTP GET 請求載入信息。
這是一個簡單的 GET 請求功能以取代復雜 $.ajax 。請求成功時可調(diào)用回調(diào)函數(shù)。如果需要在出錯時執(zhí)行函數(shù),請使用 $.ajax。
講解:
此函數(shù)發(fā)送Get請求, 參數(shù)可以直接在url中拼接, 比如:
- <script>
- $.get("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click");
- </script>
或者通過data參數(shù)傳遞:
- <script>
- $.get("../data/AjaxGetMethod.aspx", { "param": "btnAjaxGet2_click" });
- </script>
兩種方式效果相同, data參數(shù)會自動添加到請求的url中如果url中的某個參數(shù), 又通過data參數(shù)傳遞, 不會自動合并相同名稱的參數(shù).回調(diào)函數(shù)的簽名如下:
- <script>
- function (data, textStatus) {
- // data could be xmlDoc, jsonObj, html, text, etc...
- this; // the options for this ajax request
- }
- </script>
其中data是返回的數(shù)據(jù), testStatus表示狀態(tài)碼, 可能是如下值:
"timeout","error","notmodified","success","parsererror"
在回調(diào)函數(shù)中的this是獲取options對象的引用.有關options的各種說明, 請參見:
http://docs.jquery.com/Ajax/jQuery.ajax#options
type參數(shù)是指data數(shù)據(jù)的類型, 可能是下面的值:
"xml", "html", "script", "json", "jsonp", "text".
默認為"html".
jQuery.getJSON( url, [data], [callback] ) 方法就相當于 jQuery.get(url, [data],[callback], "json")
3. jQuery.getJSON( url, [data], [callback] )
Returns: XMLHttpRequest
相當于: jQuery.get(url, [data],[callback], "json")
說明:通過 HTTP GET 請求載入 JSON 數(shù)據(jù)。
在jQuery 1.2 中,您可以通過使用JSONP 形式的回調(diào)函數(shù)來加載其他網(wǎng)域的JSON數(shù)據(jù),如 "myurl?callback=?"。jQuery 將自動替換 ? 為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。
注意:此行以后的代碼將在這個回調(diào)函數(shù)執(zhí)行前執(zhí)行。
講解:getJSON函數(shù)僅僅將get函數(shù)的type參數(shù)設置為"JSON"而已. 在回調(diào)函數(shù)中獲取的數(shù)據(jù)已經(jīng)是按照JSON格式解析后的對象了:
- <script>
- $.getJSON("../data/AjaxGetCityInfo.aspx", { "resultType": "json" }, function(data, textStatus)
- {
- alert(data.length);
- alert(data[0].CityName);
- });
- </script>
服務器端返回的字符串如下:
- <script>
- [{""pkid"":""0997"",""ProvinceId"":""XJ"",""CityName"":""阿克蘇"",""CityNameEn"":""Akesu"",""PostCode"":""843000"",""isHotCity"":false},
- {""pkid"":""0412"",""ProvinceId"":""LN"",""CityName"":""鞍山"",""CityNameEn"":""Anshan"",""PostCode"":""114000"",""isHotCity"":false}]
- </script>
4.jQuery.getScript( url, [callback] )
Returns: XMLHttpRequest
相當于: jQuery.get(url, null, [callback], "script")
說明:通過 HTTP GET 請求載入并執(zhí)行一個 JavaScript 文件。
jQuery 1.2 版本之前,getScript 只能調(diào)用同域 JS 文件。 1.2中,您可以跨域調(diào)用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步執(zhí)行腳本。如果通過 getScript 加入腳本,請加入延時函數(shù)。
講解:
以前我使用dojo類庫時官方默認的文件不支持跨域***導致我放棄使用dojo(雖然在網(wǎng)上找到了可以跨域的版本, 但是感覺不夠***). 所以我特別對這個函數(shù)的核心實現(xiàn)和使用做了研究.
首先了解此函數(shù)的jQuery內(nèi)部實現(xiàn), 仍然使用get函數(shù), jQuery所有的Ajax函數(shù)包括get***都是用的是jQuery.ajax(), getScript將傳入值為"script"的type參數(shù), ***在Ajax函數(shù)中對type為script的請求做了如下處理:
- <script>
- var head = document.getElementsByTagName("head")[0];
- var script = document.createElement("script");
- sscript.src = s.url;
- </script>
上面的代碼動態(tài)建立了一個script語句塊, 并且將其加入到head中:
- <script>
- head.appendChild(script);
- </script>
當腳本加載完畢后, 再從head中刪除:
- <script>
- // Handle Script loading
- if ( !jsonp ) {
- var done = false;
- // Attach handlers for all browsers
- scriptscript.onload = script.onreadystatechange = function(){
- if ( !done && (!this.readyState ||
- this.readyState == "loaded" || this.readyState == "complete") ) {
- done = true;
- success();
- complete();
- // Handle memory leak in IE
- scriptscript.onload = script.onreadystatechange = null;
- head.removeChild( script );
- }
- };
- }
- </script>
5. jQuery.post( url, [data], [callback], [type] )
Returns: XMLHttpRequest
說明:通過遠程 HTTP POST 請求載入信息。
這是一個簡單的 POST 請求功能以取代復雜 $.ajax 。請求成功時可調(diào)用回調(diào)函數(shù)。如果需要在出錯時執(zhí)行函數(shù),請使用 $.ajax。
講解:具體用法和get相同, 只是提交方式由"GET"改為"POST".
6. jQuery.ajax( options )
Returns: XMLHttpRequest
說明:通過 HTTP 請求加載遠程數(shù)據(jù)。
jQuery 底層 AJAX 實現(xiàn)。簡單易用的高層實現(xiàn)見 $.get, $.post 等。
$.ajax() 返回其創(chuàng)建的 XMLHttpRequest 對象。大多數(shù)情況下你無需直接操作該對象,但特殊情況下可用于手動終止請求。
$.ajax() 只有一個參數(shù):參數(shù) key/value 對象,包含各配置及回調(diào)函數(shù)信息。詳細參數(shù)選項見下。
注意: 如果你指定了 dataType 選項,請確保服務器返回正確的 MIME 信息,(如 xml 返回 "text/xml")。錯誤的 MIME 類型可能導致不可預知的錯誤。見 Specifying the Data Type for AJAX Requests 。
注意:如果dataType設置為"script",那么所有的遠程(不在同一域名下)的POST請求都將轉(zhuǎn)化為GET請求。(因為將使用DOM的script標簽來加載)
jQuery 1.2 中,您可以跨域加載 JSON 數(shù)據(jù),使用時需將數(shù)據(jù)類型設置為 JSONP。使用 JSONP 形式調(diào)用函數(shù)時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。數(shù)據(jù)類型設置為 "jsonp" 時,jQuery 將自動調(diào)用回調(diào)函數(shù)。
講解:
這是jQuery中Ajax的核心函數(shù), 上面所有的發(fā)送Ajax請求的函數(shù)內(nèi)部***都會調(diào)用此函數(shù).options參數(shù)支持很多參數(shù), 使用這些參數(shù)可以完全控制ajax請求. 在Ajax回調(diào)函數(shù)中的this對象也是options對象.
因為平時使用最多的還是簡化了的get和post函數(shù), 所以在此不對options參數(shù)做詳細講解了. options參數(shù)文檔請見:http://docs.jquery.com/Ajax/jQuery.ajax#options
本文介紹如何使用jquery實現(xiàn)Ajax功能. 用于發(fā)送Ajax請求的相關函數(shù)如load, get, getJSON和post這些漸變Ajax方法, 對于核心的ajax 方法沒有過多介紹, 主要是通過配置復雜的參數(shù)實現(xiàn)完全控制Ajax請求。