一、XMLHttpRequest對(duì)象的歷史
XMLHttpRequest類(lèi)首先由Internet Explorer以ActiveX對(duì)象引入,被稱(chēng)為XMLHTTP。 后來(lái)Mozilla、Netscape、Safari和其他瀏覽器也提供了
XMLHttpRequest類(lèi),不過(guò)它們創(chuàng)建XMLHttpRequest類(lèi)的方法不同。IE的版本不同,創(chuàng)建XMLHttpRequest也不同。


二、XMLHttpRequest對(duì)象創(chuàng)建方法
IE:
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP.3.0"); //3.0或4.0, 5.0
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp_request = new ActiveXObject("Microsoft.XMLHTTP");
Other:
xmlhttp_request = new XMLHttpRequest();

如果服務(wù)器的響應(yīng)沒(méi)有XML mime-type header,某些Mozilla瀏覽器可能無(wú)法正常工作。 為了解決這個(gè)問(wèn)題,如果服務(wù)器響應(yīng)的header不是
text/xml,可以調(diào)用其它方法修改該header。

xmlhttp_request = new XMLHttpRequest();
xmlhttp_request.overrideMimeType('text/xml');

三、XMLHttpRequest對(duì)象的處理過(guò)程。
1.發(fā)送遠(yuǎn)程請(qǐng)求
   
xmlhttp_request.open('GET', URL, true);
xmlhttp_request.send(null);

open():
第一個(gè)參數(shù)是HTTP請(qǐng)求方式—GET,POST或任何服務(wù)器所支持的您想調(diào)用的方式。 按照HTTP規(guī)范,該參數(shù)要大寫(xiě);否則,某些瀏覽器(如Firefox)可能無(wú)法處理請(qǐng)求。
第二個(gè)參數(shù)是請(qǐng)求頁(yè)面的URL。
第三個(gè)參數(shù)設(shè)置請(qǐng)求是否為異步模式。如果是TRUE,JavaScript函數(shù)將繼續(xù)執(zhí)行,而不等待服務(wù)器響應(yīng)。這就是"AJAX"中的"A"(異步)。

2.響應(yīng)結(jié)束后,處理函數(shù)設(shè)置

xmlhttp_request.onreadystatechange =FunctionName;
FunctionName是用JavaScript創(chuàng)建的函數(shù)名,注意不要寫(xiě)成FunctionName(),當(dāng)然我們也可以直接將JavaScript代碼創(chuàng)建在onreadystatechange之后,例如:
xmlhttp_request.onreadystatechange = function(){
// JavaScript代碼段
};

3.響應(yīng)后狀態(tài)
只有當(dāng)一個(gè)完整的服務(wù)器響應(yīng)已經(jīng)收到了,函數(shù)才可以處理該響應(yīng)。XMLHttpRequest 提供了readyState屬性來(lái)對(duì)服務(wù)器響應(yīng)進(jìn)行判斷。
readyState的取值如下:
  0 (未初始化)
  1 (正在裝載)
  2 (裝載完畢)
  3 (交互中)
  4 (完成)
所以只有當(dāng)readyState=4時(shí),一個(gè)完整的服務(wù)器響應(yīng)已經(jīng)收到了,函數(shù)才可以處理該響應(yīng)。

if (http_request.readyState == 4) {
// 收到完整的服務(wù)器響應(yīng)
} else {
// 沒(méi)有收到完整的服務(wù)器響應(yīng)
}

4.響應(yīng)后返回值
有兩種方式可以得到這些數(shù)據(jù):
(1) 以文本字符串的方式返回服務(wù)器的響應(yīng)
(2) 以XMLDocument對(duì)象方式返回響應(yīng)
eg:
var response = xmlhttp_request.responseXML.documentElement;
var result = response.getElementsByTagName('result')[0].firstChild.data;//返回result節(jié)點(diǎn)數(shù)據(jù)
if(result ==-2){
document.getElementById('message').innerHTML = "用戶(hù)名"+document.getElementById('163id').value+"尚未注冊(cè)";
}
else if(result ==-1){
document.getElementById('message').innerHTML = "對(duì)不起,用戶(hù)名"+document.getElementById('163id').value+"已經(jīng)注冊(cè)";
}

四、XMLHttpRequest對(duì)象屬性
onreadystatechange 狀態(tài)改變的事件觸發(fā)器
readyState 對(duì)象狀態(tài)(integer):
0 = 未初始化
1 = 讀取中
2 = 已讀取
3 = 交互中
4 = 完成
responseText 服務(wù)器進(jìn)程返回?cái)?shù)據(jù)的文本版本
responseXML 服務(wù)器進(jìn)程返回?cái)?shù)據(jù)的兼容DOM的XML文檔對(duì)象
status 服務(wù)器返回的狀態(tài)碼, 如:404 = "文件末找到" 、200 ="成功"
statusText 服務(wù)器返回的狀態(tài)文本信息

五、XMLHttpRequest對(duì)象方法
abort() 停止當(dāng)前請(qǐng)求
getAllResponseHeaders() 作為字符串返問(wèn)完整的headers
getResponseHeader("headerLabel") 作為字符串返問(wèn)單個(gè)的header標(biāo)簽
open("method","URL"[,asyncFlag[,"userName"[, "password"]]]) 設(shè)置未決的請(qǐng)求的目標(biāo) URL, 方法, 和其他參數(shù)
send(content) 發(fā)送請(qǐng)求
setRequestHeader("label", "value") 設(shè)置header并和請(qǐng)求一起發(fā)送

六、附錄
HTTP 1.1支持的狀態(tài)代碼
100 Continue 初始的請(qǐng)求已經(jīng)接受,客戶(hù)應(yīng)當(dāng)繼續(xù)發(fā)送請(qǐng)求的其余部分
101 Switching Protocols 服務(wù)器將遵從客戶(hù)的請(qǐng)求轉(zhuǎn)換到另外一種協(xié)議
200 OK 一切正常,對(duì)GET和POST請(qǐng)求的應(yīng)答文檔跟在后面。
201 Created 服務(wù)器已經(jīng)創(chuàng)建了文檔,Location頭給出了它的URL。
202 Accepted 已經(jīng)接受請(qǐng)求,但處理尚未完成。
203 Non-Authoritative Information 文檔已經(jīng)正常地返回,但一些應(yīng)答頭可能不正確,因?yàn)槭褂玫氖俏臋n的拷貝
204 No Content 沒(méi)有新文檔,瀏覽器應(yīng)該繼續(xù)顯示原來(lái)的文檔。如果用戶(hù)定期地刷新頁(yè)面,而Servlet可以確定用戶(hù)文檔足夠新,這個(gè)狀態(tài)代碼是很有用的
205 Reset Content 沒(méi)有新的內(nèi)容,但瀏覽器應(yīng)該重置它所顯示的內(nèi)容。用來(lái)強(qiáng)制瀏覽器清除表單輸入內(nèi)容
206 Partial Content 客戶(hù)發(fā)送了一個(gè)帶有Range頭的GET請(qǐng)求,服務(wù)器完成了它
300 Multiple Choices 客戶(hù)請(qǐng)求的文檔可以在多個(gè)位置找到,這些位置已經(jīng)在返回的文檔內(nèi)列出。如果服務(wù)器要提出優(yōu)先選擇,則應(yīng)該在Location應(yīng)答頭指明。
301 Moved Permanently 客戶(hù)請(qǐng)求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應(yīng)該自動(dòng)地訪問(wèn)新的URL。
302 Found 類(lèi)似于301,但新的URL應(yīng)該被視為臨時(shí)性的替代,而不是永久性的。
303 See Other 類(lèi)似于301/302,不同之處在于,如果原來(lái)的請(qǐng)求是POST,Location頭指定的重定向目標(biāo)文檔應(yīng)該通過(guò)GET提取
304 Not Modified 客戶(hù)端有緩沖的文檔并發(fā)出了一個(gè)條件性的請(qǐng)求(一般是提供If-Modified-Since頭表示客戶(hù)只想比指定日期更新的文檔)。服務(wù)器告訴客戶(hù),原來(lái)緩沖的文檔還可以繼續(xù)使用。
305 Use Proxy 客戶(hù)請(qǐng)求的文檔應(yīng)該通過(guò)Location頭所指明的代理服務(wù)器提取
307 Temporary Redirect 和302(Found)相同。許多瀏覽器會(huì)錯(cuò)誤地響應(yīng)302應(yīng)答進(jìn)行重定向,即使原來(lái)的請(qǐng)求是POST,即使它實(shí)際上只能在POST請(qǐng)求的應(yīng)答是303時(shí)才能重定向。由于這個(gè)原因,HTTP 1.1新增了307,以便更加清除地區(qū)分幾個(gè)狀態(tài)代碼:當(dāng)出現(xiàn)303應(yīng)答時(shí),瀏覽器可以跟隨重定向的GET和POST請(qǐng)求;如果是307應(yīng)答,則瀏覽器只能跟隨對(duì)GET請(qǐng)求的重定向。
400 Bad Request 請(qǐng)求出現(xiàn)語(yǔ)法錯(cuò)誤。
401 Unauthorized 客戶(hù)試圖未經(jīng)授權(quán)訪問(wèn)受密碼保護(hù)的頁(yè)面。應(yīng)答中會(huì)包含一個(gè)WWW-Authenticate頭,瀏覽器據(jù)此顯示用戶(hù)名字/密碼對(duì)話(huà)框,然后在填寫(xiě)合適的Authorization頭后再次發(fā)出請(qǐng)求。
403 Forbidden 資源不可用。
404 Not Found 無(wú)法找到指定位置的資源
405 Method Not Allowed 請(qǐng)求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)對(duì)指定的資源不適用。
406 Not Acceptable 指定的資源已經(jīng)找到,但它的MIME類(lèi)型和客戶(hù)在Accpet頭中所指定的不兼容
407 Proxy Authentication Required 類(lèi)似于401,表示客戶(hù)必須先經(jīng)過(guò)代理服務(wù)器的授權(quán)。
408 Request Timeout 在服務(wù)器許可的等待時(shí)間內(nèi),客戶(hù)一直沒(méi)有發(fā)出任何請(qǐng)求。客戶(hù)可以在以后重復(fù)同一請(qǐng)求。
409 Conflict 通常和PUT請(qǐng)求有關(guān)。由于請(qǐng)求和資源的當(dāng)前狀態(tài)相沖突,因此請(qǐng)求不能成功。
410 Gone 所請(qǐng)求的文檔已經(jīng)不再可用,而且服務(wù)器不知道應(yīng)該重定向到哪一個(gè)地址。它和404的不同在于,返回407表示文檔永久地離開(kāi)了指定的位置,而404表示由于未知的原因文檔不可用。
411 Length Required 服務(wù)器不能處理請(qǐng)求,除非客戶(hù)發(fā)送一個(gè)Content-Length頭。
412 Precondition Failed 請(qǐng)求頭中指定的一些前提條件失敗
413 Request Entity Too Large 目標(biāo)文檔的大小超過(guò)服務(wù)器當(dāng)前愿意處理的大小。如果服務(wù)器認(rèn)為自己能夠稍后再處理該請(qǐng)求,則應(yīng)該提供一個(gè)Retry-After頭
414 Request URI Too Long URI太長(zhǎng)
416 Requested Range Not Satisfiable 服務(wù)器不能滿(mǎn)足客戶(hù)在請(qǐng)求中指定的Range頭
500 Internal Server Error 服務(wù)器遇到了意料不到的情況,不能完成客戶(hù)的請(qǐng)求
501 Not Implemented 服務(wù)器不支持實(shí)現(xiàn)請(qǐng)求所需要的功能。例如,客戶(hù)發(fā)出了一個(gè)服務(wù)器不支持的PUT請(qǐng)求
502 Bad Gateway 服務(wù)器作為網(wǎng)關(guān)或者代理時(shí),為了完成請(qǐng)求訪問(wèn)下一個(gè)服務(wù)器,但該服務(wù)器返回了非法的應(yīng)答
503 Service Unavailable 服務(wù)器由于維護(hù)或者負(fù)載過(guò)重未能應(yīng)答。例如,Servlet可能在數(shù)據(jù)庫(kù)連接池已滿(mǎn)的情況下返回503。服務(wù)器返回503時(shí)可以提供一個(gè)Retry-After頭
504 Gateway Timeout 由作為代理或網(wǎng)關(guān)的服務(wù)器使用,表示不能及時(shí)地從遠(yuǎn)程服務(wù)器獲得應(yīng)答
505 HTTP Version Not Supported 服務(wù)器不支持請(qǐng)求中所指明的HTTP版本