JavaScript Ajax

Ajax的核心對象爲[url=http://www.w3.org/TR/XMLHttpRequest/]XMLHttpRequest[/url]對象,XMLHttpRequest負責前臺與後臺異步網絡請求的交互。w3c對XMLHttpReqeust進行規範,但在各個瀏覽中新建XMLHttpRequest對象的方式仍然不同,使用時需要作瀏覽器兼容性的判斷。作瀏覽器兼容性的判斷。

[size=large][b]JavaScript的XMLHttpRequest對象[/b][/size]

var xmlHttpRequest;
// 創建XMLHttpRequest對象,在各個瀏覽器上,該對象的名稱及創建方法不一樣
function createXMLHttpRequest() {
if (window.XMLHttpRequest) {
// Firefox Chrome IE7+ 等瀏覽器支持 XMLHttpRequest 對象
return new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
// IE6等
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
// IE5等更老版本的瀏覽器
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
};
if( typeof window.HY == 'undefined') {
HY = {};
}
HY.ajax = {
callback : function() {
if(xmlHttpRequest.readyState == 4) {
if(xmlHttpRequest.status == 200) {
var args = "";
for(var i = 0; i < arguments.lenght; i++) {
args += arguments[i] + "\n";
}
alert(args);
}
}
},
// 發送Ajax請求
submit : function() {
if(xmlHttpRequest == null || typeof xmlHttpRequest == 'undefined') {
xmlHttpRequest = createXMLHttpRequest();
}
xmlHttpRequest.open("GET", "getData", true);
xmlHttpRequest.onreadystatechange = this.callback;
xmlHttpRequest.send(null);
}
};

調用方式:

function submit() {
HY.ajax.submit();
}

XMLHttpReqeust重要屬性:
[size=medium][b]readyState[/b][/size]
Http請求的狀態,包含0-4共5個值,readyState的改變會觸發onreadystatechange回調方法執行。
[quote]0 init, XMLHttpRequest對象被創建或者XMLHttpRequest對象已被 abort() 方法重置
1 open,但是未send發送請求
2 send,向服務器發送請求,但未收到迴應
3 receiving,響應請求頭已經接收完成,響應開始接收,但未完成
4 loaded,響應體完成接收
[/quote]
[size=medium][b]responseText[/b][/size]
XMLHttpRequest響應體接收完成,status狀態爲200後,responseText爲響應體的文本(不包含響應頭)

[size=medium][b]responseXML[/b][/size]
XMLHttpRequest響應體接收完成,status狀態爲400後,若響應體的格式爲XML,則responseXML返回的是XML相關的Dom對象,擁有對DOM操作的API

[size=medium][b]status[/b][/size]
HTTP的狀態碼,200表示成功,404表示頁面不存在,500表面服務器異常

[size=medium][b]statusText[/b][/size]
HTTP狀態描述文本:OK表示200,Not Found表示400,與status對應

XMLHttpRequest常用方法:open, onreadystatechange, send方法
[size=medium][b]open(method, url, async)[/b][/size]
method 以GET或者以POST方式發送Ajax請求
url 請求鏈接。大部分情況下,瀏覽器要求url與當前頁面必需是同一個域名,同端口號,才能發起Ajax請求。
async 是否以異步方式發起請求。若async爲false,則send()方法響應完成後才能發起後續的send流程。

參考w3school中的open方法的說明
[quote]
這個方法初始化請求參數以供 send() 方法稍後使用。它把 readyState 設置爲 1,刪除之前指定的所有請求頭部,以及之前接收的所有響應頭部,並且把 responseText、responseXML、status 以及 statusText 參數設置爲它們的默認值。當 readyState 爲 0 的時候(當 XMLHttpRequest 對象剛創建或者 abort() 方法調用後)以及當 readyState 爲 4 時(已經接收響應時),調用這個方法是安全的。當針對任何其他狀態調用的時候,open() 方法的行爲是爲指定的。
除了保存供 send() 方法使用的請求參數,以及重置 XMLHttpRequest 對象以便複用,open() 方法沒有其他的行爲。要特別注意,當這個方法調用的時候,實現通常不會打開一個到 Web 服務器的網絡連接。
[/quote]

[size=medium][b]send(body)[/b][/size]
body可以爲一個字符串或者是Document對象,該參數可以爲null。
send方法在readyState不等於1時(由open()方法設置),則拋出異常。否則,它發送一個HTTP請求,該請求由以下幾部分組成:

[quote]之前調用 open() 時指定的 HTTP 方法、URL 以及認證資格(如果有的話)。
之前調用 setRequestHeader() 時指定的請求頭部(如果有的話)。
傳遞給這個方法的 body 參數。
[/quote]
send()發出請求後,將readyState設置爲2。如果open()方法設置的async參數爲false,這個方法會阻塞並不會返回,直接readyState爲4並且服務器的響應被完全接收。如果async參數爲true,或者這個參數被忽略,則send()立即返回。
[quote]如果服務器響應帶有一個 HTTP 重定向,send() 方法或後臺線程自動遵從重定向。當所有的 HTTP 響應頭部已經接收,send() 或後臺線程把 readyState 設置爲 3 並觸發 onreadystatechange 事件句柄。如果響應較長,send() 或後臺線程可能在狀態 3 中觸發 onreadystatechange 事件句柄:這可以作爲一個下載進度指示器。最後,當響應完成,send() 或後臺線程把 readyState 設置爲 4,並最後一次觸發事件句柄。
[/quote]

[size=medium][b]abort()[/b][/size]
abort方法將XMLHttpRequest對獎的readyState置爲0,清空所有請求行爲,一般可用於超時處理。
[size=medium][b]setRequestHeader()[/b][/size]
setRequestHeader() 方法指定了一個 HTTP 請求的頭部,它應該包含在通過後續 send() 調用而發佈的請求中。這個方法只有當 readyState 爲 1 的時候才能調用,例如,在調用了 open() 之後,但在調用 send() 之前。
如果帶有指定名稱的頭部已經被指定了,這個頭部的新值就是:之前指定的值,加上逗號、空白以及這個調用指定的值。
如果 open() 調用指定了認證資格,XMLHttpRequest 自動發送一個適當的 Authorization 請求頭部。但是,你可以使用 setRequestHeader() 來添加這個頭部。類似地,如果 Web 服務器已經保存了和傳遞給 open() 的 URL 相關聯的 cookie,適當的 Cookie 或 Cookie2 頭部也自動地包含到請求中。可以通過調用 setRequestHeader() 來把這些 cookie 添加到頭部。XMLHttpRequest 也可以爲 User-Agent 頭部提供一個默認值。如果它這麼做,你爲該頭部指定的任何值都會添加到這個默認值後面。
有些請求頭部由 XMLHttpRequest 自動設置而不是由這個方法設置,以符合 HTTP 協議。這包括如下和代理相關的頭部:
Host
Connection
Keep-Alive
Accept-charset
Accept-Encoding
If-Modified-Since
If-None-Match
If-Range
Range
[size=medium][b]getAllResponseHeaders()[/b][/size]
當readyState 小於 3時,此方法返回null,否則返回服務器發送的所有的HTTP響應的頭部。頭部作爲單個字符串返回,一行一個頭部。每行用換行符 "\r\n" 隔開
[size=medium][b]getResponseHeader(header_name)[/b][/size]
返回指定的HTTP響應頭部的值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章