jQuery Ajax 詳解
jQuery Ajax 詳解
jQuery提供了幾個用於發送Ajax請求的函數. 其中最核心也是最複雜的是jQuery.ajax( options ),所有的其他Ajax函數都是它的一個簡化調用. 當我們想要完全控制Ajax時可以使用此結果, 否則還是使用簡化方法如get, post, load等更加方便. 所以jQuery.ajax( options )方法放到最後一個介紹. 先介紹最簡單的load方法:
1. load( url, [data], [callback] )
#Returns: jQuery包裝集
說明:
load方法能夠載入遠端HTML 檔案程式碼並插入到DOM 中。
預設使用 GET 方式, 如果傳遞了data參數則使用Post方式.
- 傳遞附加參數時自動轉換為 POST 方式。 jQuery 1.2 中,可以指定選擇符,來篩選載入的 HTML 文檔,DOM 中將只插入篩選出的 HTML 程式碼。語法形如"url #some > selector", 預設的選擇器是"body>*".
講解:
load是最簡單的Ajax函數, 但是使用具有局限性:
它主要用於直接傳回HTML的Ajax介面
load是一個jQuery包裝集方法,需要在jQuery包裝集上呼叫,並且會將傳回的HTML載入到物件中,即使設定了回呼函數還是會載入.
不過不可否認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)
{
//发送Get请求
$("#divResult").load("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click" + "×tamp=" + (new Date()).getTime());
});
$("#btnAjaxPost").click(function(event)
{
//发送Post请求
$("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxPost_click" });
});
$("#btnAjaxCallBack").click(function(event)
{
//发送Post请求, 返回后执行回调函数.
$("#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)
{
//发送Get请求, 从结果中过滤掉 "鞍山" 这一项
$("#divResult").load("../data/AjaxGetCityInfo.aspx?resultType=html" + "×tamp=" + (new Date()).getTime() + " ul>li:not(:contains('鞍山'))");
});
})
</script>
</head>
<body>
<button id="btnAjaxGet">使用Load执行Get请求</button><br />
<button id="btnAjaxPost">使用Load执行Post请求</button><br />
<button id="btnAjaxCallBack">使用带有回调函数的Load方法</button><br />
<button id="btnAjaxFiltHtml">使用selector过滤返回的HTML内容</button>
<br />
<div id="divResult"></div>
</body>
</html> 上面的範例示範如何使用Load方法.
提示:我們要隨時注意瀏覽器快取, 當使用GET方式時要加入時間戳參數(net Date()).getTime() 來確保每次傳送的URL不同, 可以避免瀏覽器快取.
提示: 當在url參數後面添加了一個空格, 例如" "的時候, 會出現"無法識別符號"的錯誤, 請求還是能正常發送. 但是無法載入HTML到DOM. 刪除後問題解決.
#2.jQuery.get( url, [data], [callback], [type] )
Returns: XMLHttpRequest
說明:
透過遠端HTTP GET 請求載入訊息。
這是一個簡單的 GET 請求功能以取代複雜 $.ajax 。請求成功時可呼叫回調函數。如果需要在出錯時執行函數,請使用 $.ajax。
講解:
此函數傳送Get請求, 參數可以直接在url中拼接, 例如:
$.get("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click");或透過data參數傳遞:
$.get("../data/AjaxGetMethod.aspx", { "param": "btnAjaxGet2_click" });兩種方式效果相同, data參數會自動加入到請求的url中
如果url中的某個參數, 又透過data參數傳遞, 不會自動合併相同名稱的參數.
回呼函數的簽章如下:
function (data, textStatus) {
// data could be xmlDoc, jsonObj, html, text, etc...
this; // the options for this ajax request
}其中data是傳回的資料, testStatus表示狀態碼, 可能是如下值:
"timeout","error","notmodified","success","parsererror"
在回呼函數中的this是取得options物件的參考.有關options的各種說明, 請參閱:
http://docs.jquery.com/Ajax/jQuery.ajax#options
type參數是指data資料的型別, 可能是下面的值:
"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 資料。
在 jQuery 1.2 中,您可以透過使用JSONP 形式的回呼函數來載入其他網域的JSON數據,例如 "myurl?callback=?"。 jQuery 將自動替換 ? 為正確的函數名,以執行回呼函數。
注意:此行以後的程式碼將在這個回呼函數執行前執行。
解說:
getJSON函數僅將get函數的type參數設為"JSON"而已. 在回呼函數中取得的資料已經是按照JSON格式解析後的物件了:
$.getJSON("../data/AjaxGetCityInfo.aspx", { "resultType": "json" }, function(data, textStatus)
{
alert(data.length);
alert(data[0].CityName);
});伺服器端傳回的字串如下:
#[{""pkid"":""0997"",""ProvinceId"":"" XJ"",""CityName"":""阿克蘇"",""CityNameEn"":""Akesu"",""PostCode"":""843000"",""isHotCity"":false},
{""pkid"":""0412"",""ProvinceId"":""LN"",""CityName"":""鞍山"",""CityNameEn"" :""Anshan"",""PostCode"":""114000"",""isHotCity"":false}]
範例中我回傳的是一個陣列, 使用data.length可以取得陣列的元素個數, data[0]存取第一個元素, data[0].CityName存取第一個元素的CityName屬性.
4.jQuery.getScript( url, [callback] )
Returns: XMLHttpRequest
等於: jQuery.get(url, null, [callback], "script")
說明:
透過HTTP GET 要求載入並執行一個JavaScript 檔案。
jQuery 1.2 版本之前,getScript 只能呼叫同域 JS 檔案。 1.2中,您可以跨域呼叫 JavaScript 檔案。注意:Safari 2 或更早的版本不能在全域作用域中同步執行腳本。如果透過 getScript 加入腳本,請加入延時函數。
講解:
以前我使用dojo類庫時官方默認的文件不支持跨域最後導致我放棄使用dojo(雖然在網上找到了可以跨域的版本, 但是感覺不夠完美). 所以我特別對這個函數的核心實作和使用做了研究.
首先了解此函數的jQuery內部實作, 仍然使用get函數, jQuery所有的Ajax函數包括get最後都是用的是jQuery.ajax(), getScript將傳入值為"script"的type參數, 最後在Ajax函數中對type為script的請求做瞭如下處理:
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = s.url;上面的程式碼動態建立了一個script語句區塊, 並且將其加入head中:
head.appendChild(script);
當腳本載入完畢後, 再從head刪除:
// Handle Script loading
if ( !jsonp ) {
var done = false;
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function(){
if ( !done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete") ) {
done = true;
success();
complete();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
head.removeChild( script );
}
};
}主要測試了此函數的跨域存取和多瀏覽器支援.下面是結果:
| #IE6 | FireFox | ##請注意事項||
| 非跨域引用js | #透過透過 | 回呼函數中的data和textStatus均可用 | |
| 透過 | 透過 | 回呼函數中的data和textStatus均為undifined |
















課件暫不提供下載,工作人員正在整理中,後期請多關注該課程~ 