4.6.2 XMLHttpRequest 對(duì)象的屬性和方法
IE5.0 開始,開發(fā)人員可以在 Web 頁面內(nèi)部使用 XMLHTTP ActiveX 組件擴(kuò)展自身的功能,不用從當(dāng)前的 Web 頁面導(dǎo)航就可以直接將數(shù)據(jù)傳輸?shù)椒?wù)器或者從服務(wù)器接收數(shù)據(jù)。 Mozilla1.0 以及 NetScape7 則是創(chuàng)建繼承 XML 的代理類 XMLHttpRequest ;對(duì)于大多數(shù)情況, XMLHttpRequest 對(duì)象和 XMLHttp 組件很相似,方法和屬性類似,只是部分屬性不同。例程 4-25 的代碼段顯示了如何在 IE 瀏覽器和 Mozilla 瀏覽器中創(chuàng)建 XMLHttp- Request 對(duì)象。
例程 4-25 創(chuàng)建 XMLHttpRequest 對(duì)象
<script language="javascript">
var http_request = false;
//IE 瀏覽器
http_request = new ActiveXObject("Msxml2.XMLHTTP");
http_request = new ActiveXObject("Microsoft.XMLHTTP");
//Mozilla 瀏覽器
http_request = new XMLHttpRequest();
</script>
不同版本的 IE 瀏覽器采用不同方式創(chuàng)建 XMLHttpRequest 對(duì)象,某些舊版本使用 Microsoft.XMLHTTP ,而較新的版本則使用 Msxml2.XMLHTTP 。通常,為了保證 Ajax 程序的瀏覽器兼容性,需要注意創(chuàng)建 XMLHttpRequest 對(duì)象的程序,要同時(shí)支持這兩種創(chuàng)建方式。
X MLHttpRequest 對(duì)象提供了一系列屬性和方法,來向服務(wù)器發(fā)起異步 http 請(qǐng)求,監(jiān) 聽服務(wù) 器的狀態(tài),并在服務(wù)器完成數(shù)據(jù)響應(yīng)處理之后接收服務(wù)器返回的信息數(shù)據(jù)。表 4-1 7 列出了 XMLHttpRequest 對(duì)象的屬性。
表 4-17 XMLHttpRequest 對(duì)象屬性
屬 性 |
描 述 |
onreadystatechange |
指定當(dāng) readyState 屬性改變時(shí)的事件處理句柄,屬性為只寫 |
readyState |
返回當(dāng)前請(qǐng)求的狀態(tài),屬性為只讀 |
responseBody |
將回應(yīng)信息正文以 unsigned byte 數(shù)組形式返回,屬性為只讀 |
responseStream |
以 Ado Stream 對(duì)象的形式返回響應(yīng)信息,屬性為只讀 |
responseText |
以字符串的形式返回服務(wù)器響應(yīng)信息,屬性為只讀 |
responseXML |
將響應(yīng)信息格式化為 XML Document 對(duì)象返回,屬性為只讀 |
status |
返回當(dāng)前 HTTP 請(qǐng)求的狀態(tài)碼,屬性為只讀。如: 404 = " 文件未找到 " 、 200 = " 成功 " |
statusText |
返回當(dāng)前 HTTP 請(qǐng)求的狀態(tài)行,屬性為只讀 |
XMLHttpRequest 對(duì)象屬性 readyState 返回當(dāng)前 XMLHttp 請(qǐng)求的狀態(tài),這些狀態(tài)用長 度為 4 的整形數(shù)據(jù)表示,其屬性的狀態(tài)含義如表 4-18 所示:
表 4-18 readyState 屬性的狀態(tài)
狀 態(tài) |
含 義 |
說 明 |
0 |
未初始化 |
對(duì)象已經(jīng)建立,但是未初始化,即尚未調(diào)用 open 方法創(chuàng)建 http 請(qǐng)求 |
1 |
初始化 |
對(duì)象已經(jīng)建立,但是為調(diào)用 send 方法發(fā)送 http 請(qǐng)求 |
2 |
發(fā)送數(shù)據(jù) |
send 方法已經(jīng)被調(diào)用,但是當(dāng)前的狀態(tài)以及 http 頭未知 |
3 |
數(shù)據(jù)傳送中 |
已經(jīng)接收部分?jǐn)?shù)據(jù),因?yàn)轫憫?yīng)及 http 頭不全,這是通過 response 系列方法獲取部分?jǐn)?shù)據(jù)會(huì)出現(xiàn)錯(cuò)誤 |
4 |
傳送完成 |
數(shù)據(jù)接收完畢,此時(shí)可以通過 response 系列方法獲取完整的回應(yīng)數(shù)據(jù) |
XMLHttpRequest 對(duì)象屬性 onreadystatechange 是 readyState 狀態(tài)改變的事件觸發(fā)器,用來指定當(dāng) readyState 屬性發(fā)生改變時(shí)的處理事件。在使用過程中,通常通過將事件處理函數(shù)名稱賦予 onreadystatechange 的方式,來為 XMLHttpRequest 指定事件觸發(fā)器,而在事件處理函數(shù)中判斷 readyState 狀態(tài)值并做相應(yīng)的處理。例程 4-26 的代碼段指定 doState- ReadyHandler 函數(shù)作為事件處理函數(shù),并在 doStateReadyHandler 函數(shù)體內(nèi)在 readyState 狀態(tài)為 4 時(shí)彈出一個(gè)顯示“完成”信息的對(duì)話框。
例程 4-26 指定 XMLHttpRequest 對(duì)象的回調(diào)函數(shù)
var http_request = null;
http_request = new ActiveXObject("Msxml2.XMLHTTP");
function send() {
http_request.onreadystatechange = doStateReadyHandler;
http_request.open("GET","http://localhost/sample.xml",true);
http_request.send();
}
function doStateReadyHandler() {
if(http_request.readySatate==4) window.alert(" 完成 ");
}
XMLHttpRequest 對(duì)象屬性 responseText 將響應(yīng)信息以字符串的形式返回。 XMLHttp- Request 嘗試將響應(yīng)信息解碼為 Unicode 字符串,默認(rèn)的響應(yīng)數(shù)據(jù)編碼方式為 UTF-8 。如果服務(wù)器返回的數(shù)據(jù)帶有 BOM ( byte-order mark ),則 XMLHttpRequest 可以解碼任何的 UCS-2 或者 UCS-4 數(shù)據(jù)。如果服務(wù)器返回的是 XML 文檔,此屬性不處理 XML 文檔中的編碼聲明,僅將整個(gè) XML 文檔作為字符串返回。
如果服務(wù)器以 XML 文檔的格式返回響應(yīng)數(shù)據(jù),這時(shí)應(yīng)該采用 responseXML 屬性加以處理。如果響應(yīng)數(shù)據(jù)不是有效的 XML 文檔,此屬性本身不返回 XMLDOMParseError ,可以通過處理過的 DOMDocument 對(duì)象獲取錯(cuò)誤信息。在使用 responseXML 將服務(wù)器響應(yīng)數(shù)據(jù)以 XML 文檔的形式返回之前,先要將響應(yīng)的內(nèi)容類型設(shè)置為 application/xml 。
XMLHttpRequest 對(duì)象屬性 status 代表當(dāng)前 http 請(qǐng)求的狀態(tài),為長整型數(shù)據(jù)。其值及其含義如表 4-19 所示。
表 4-19 http 請(qǐng)求狀態(tài)及其含義
值 |
描 述 |
值 |
描 述 |
100 |
客戶必須繼續(xù)發(fā)出請(qǐng)求 |
404 |
沒有發(fā)現(xiàn)文件、查詢或 URl |
101 |
客戶要求服務(wù)器根據(jù)請(qǐng)求轉(zhuǎn)換 HTTP 協(xié)議版本 |
405 |
用戶在 Request-Line 字段定義的方法不允許 |
200 |
交易成功 |
406 |
根據(jù)用戶發(fā)送的 Accept 拖,請(qǐng)求資源不可訪問 |
201 |
提示知道新文件的 URL |
407 |
類似 401 ,用戶必須首先在代理服務(wù)器上得到授權(quán) |
202 |
接受和處理、但處理未完成 |
408 |
客戶端沒有在用戶指定的餓時(shí)間內(nèi)完成請(qǐng)求 |
203 |
返回信息不確定或不完整 |
409 |
對(duì)當(dāng)前資源狀態(tài),請(qǐng)求不能完成 |
204 |
請(qǐng)求收到,但返回信息為空 |
410 |
服務(wù)器上不再有此資源且無進(jìn)一步的參考地址 |
205 |
服務(wù)器完成了請(qǐng)求,用戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過的文件 |
411 |
服務(wù)器拒絕用戶定義的 Content-Length 屬性請(qǐng)求 |
206 |
服務(wù)器已經(jīng)完成了部分用戶的 GET 請(qǐng)求 |
412 |
一個(gè)或多個(gè)請(qǐng)求頭字段在當(dāng)前請(qǐng)求中錯(cuò)誤 |
300 |
請(qǐng)求的資源可在多處得到 |
413 |
請(qǐng)求的資源大于服務(wù)器允許的大小 |
301 |
刪除請(qǐng)求數(shù)據(jù) |
414 |
請(qǐng)求的資源 URL 長于服務(wù)器允許的長度 |
302 |
在其他地址發(fā)現(xiàn)了請(qǐng)求數(shù)據(jù) |
415 |
請(qǐng)求資源不支持請(qǐng)求項(xiàng)目格式 |
303 |
建議客戶訪問其他 URL 或訪問方式 |
416 |
請(qǐng)求中包含 Range 請(qǐng)求頭字段,在當(dāng)前請(qǐng)求資源范圍內(nèi)沒有 range 指示值,請(qǐng)求也不包含 If-Range 請(qǐng)求頭字段 |
304 |
客戶端已經(jīng)執(zhí)行了 GET ,但文件未變化 |
417 |
服務(wù)器不滿足請(qǐng)求 Expect 頭字段指定的期望值,如果是代理服務(wù)器,可能是下一級(jí)服務(wù)器不能滿足請(qǐng)求 |
305 |
請(qǐng)求的資源必須從服務(wù)器指定的地址得到 |
500 |
服務(wù)器產(chǎn)生內(nèi)部錯(cuò)誤 |
307 |
申明請(qǐng)求的資源臨時(shí)性刪除 |
501 |
服務(wù)器不支持請(qǐng)求的函數(shù) |
400 |
錯(cuò)誤請(qǐng)求,如語法錯(cuò)誤 |
502 |
服務(wù)器暫時(shí)不可用,有時(shí)是為了防止發(fā)生系統(tǒng)過載 |
401 |
請(qǐng)求授權(quán)失敗 |
503 |
服務(wù)器過載或暫停維修 |
402 |
保留有效 ChargeTo 頭響應(yīng) |
504 |
關(guān)口過載,服務(wù)器使用另一個(gè)關(guān)口或服務(wù)來響應(yīng)用戶,等待時(shí)間設(shè)定值較長 |
403 |
請(qǐng)求不允許 |
505 |
服務(wù)器不支持或拒絕支請(qǐng)求頭中指定的 HTTP 版本 |
在這些狀 態(tài)中,最常用到的是“ 404 ”。通常,在類似例子 4-20 中 doStateReady Handler 的事件處理函數(shù)中,判斷 status 的狀態(tài),然后做相應(yīng)的處理。
XM LHttpRequest 對(duì)象提供了包括 send 、 open 在內(nèi)的六種方法,用來向服務(wù)器發(fā)送 http 請(qǐng)求,并設(shè)置相應(yīng)的頭信息。表 4-20 列出 XMLHttpRequest 對(duì)象提供的方法及其含義。
表 4-20 XMLHttpRequest 對(duì)象的方法及其含義
方 法 |
描 述 |
abort |
取消當(dāng)前請(qǐng)求 |
getAllResourceHeaders |
獲取相應(yīng)的全部 http 頭信息 |
getResourceHeader |
從響應(yīng)信息中獲取指定的 http 頭信息 |
open |
創(chuàng)建一個(gè)新的 http 請(qǐng)求,并指定此請(qǐng)求的方法、 URL 、以及驗(yàn)證信息(用戶名 / 密碼) |
send |
發(fā)送請(qǐng)求到 http 服務(wù)器并接收回應(yīng) |
setRequestHeader |
單獨(dú)設(shè)定請(qǐng)求的某個(gè) http 頭 |
方 法 abort 的語法為: http_request.abort(); 調(diào)用此方法,當(dāng)前請(qǐng)求返回 UNINITIALIZED 狀態(tài)。
方法 getAllResourceHeaders 像 JSP 中的 HttpServletRequest 對(duì)象一樣,獲取 http 請(qǐng)求的請(qǐng)求頭信息。其語法為: headers = http_request.getAllResourceHeaders();
相對(duì), getResourceHeader 方法則是獲取某個(gè)指定的 http 頭信息,傳入的參數(shù)為這個(gè)頭信息的名稱,其語法為: header = http_request.getResourceHeader(“header-name”);
getAllResourceHeaders 和 getResourceHeader 這兩種方法,必須等到 http 請(qǐng)求發(fā)送成功即 send 方法成功執(zhí)行之后才能夠執(zhí)行,否則會(huì)報(bào)錯(cuò)。
例程 4-27 使用 getAllResourceHeaders 和 getResourceHeader 兩種方法取得相應(yīng)的頭信息,并將這些信息以彈出對(duì)話框的形式顯示出來。其執(zhí)行效果如圖 4-23 所示。
圖 4-23 獲取 http 請(qǐng)求頭信息
例程 4-27 sample4_21.htm
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Ch04-- 獲取請(qǐng)求頭信息 </title>
<script language="javascript">
var http_request = false;
function send_request() {// 初始化、指定處理函數(shù)、發(fā)送請(qǐng)求的函數(shù)
http_request = false;
// 開始初始化 XMLHttpRequest 對(duì)象
if(window.XMLHttpRequest) { //Mozilla 瀏覽器
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {// 設(shè)置 MiME 類別
http_request.overrideMimeType('text/xml');
}
}
else if (window.ActiveXObject) { // IE 瀏覽器
try {
http_request = new ActiveXObject("Msxml2.XML HTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft. XMLHTTP");
} catch (e) {}
}
}
if (!http_request) { // 異常,創(chuàng)建對(duì)象實(shí)例失敗
window.alert(" 不能創(chuàng)建 XMLHttpRequest 對(duì)象實(shí)例 .");
return false;
}
// 確定發(fā)送請(qǐng)求的方式和 URL 以及是否異步執(zhí)行下段代碼
http_request.open("GET","sample4_19.htm", false);
http_request.send(null);
window.alert(" 全部頭信息如下: /n"+http_request.getAll Response Headers() +
"/n"+" 頭信息編碼類型: /n"+http_request.getResponseHeader ("Content-Type"));
}
</script>
</head>
<body>
<input type="button" name="button" value=" 顯示頭信息 " onClick="send_ request()">
</body>
</html>
XMLHttpRequest 對(duì)象的 open 方法用來新建一個(gè) http 請(qǐng)求,并設(shè)置請(qǐng)求的方法、 URL 以及驗(yàn)證信息等。其具體語法為:
http_request.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
bstrMethod 代表 http 方法,可選值為 POST 、 GET 、 PUT 和 PROPFIND ,大小寫不敏感。 bstrUrl 為請(qǐng)求的目標(biāo) URL 地址,可以是絕對(duì)地址也可以是相對(duì)地址。 varAsync 為布爾型參數(shù),指定該請(qǐng)求是否為異步方式,默認(rèn)為 true ;如果為真,當(dāng) state 狀態(tài)改變時(shí)會(huì)調(diào)用 onreadystatechange 屬性指向的回調(diào)函數(shù)。如果服務(wù)器需要驗(yàn)證,則應(yīng)該指定 bstrUser 參數(shù)為要驗(yàn)證的用戶名, bstrPassword 參數(shù)為要驗(yàn)證的密碼。如果 bstrUser 、 bstrPassword 參數(shù)不指定,則在服務(wù)器需要驗(yàn)證的時(shí)候,會(huì)彈出驗(yàn)證對(duì)話框。
創(chuàng)建 http 請(qǐng)求之后,就可以向服務(wù)器發(fā)送 http 請(qǐng)求, send 方法被調(diào)用,其語法為:
http_request.send(varBody);
參數(shù) varBody 為要發(fā)送給服務(wù)器的內(nèi)容。如果沒有內(nèi)容要發(fā)送, varBody 參數(shù)可以省 略。此方法的同步或異步方式取決于 open 方法中的 varAsync 參數(shù),如果 varAsync 為 False , 此方法將會(huì)等待請(qǐng)求完成或者超時(shí)時(shí)才會(huì)返回,如果 varAsync 為 True ,此方法將立即返回。如果發(fā)送的數(shù)據(jù)為 BSTR ,則回應(yīng)被編碼為 UTF-8 ,必須在適當(dāng)位置設(shè)置一個(gè)包含 charset 的文檔類型頭。如果發(fā)送的數(shù)據(jù)為 XML DOM object ,則回應(yīng)將被編碼為在 xml 文檔中聲明的編碼,如果在 xml 文檔中沒有聲明編碼,則使用默認(rèn)的 UTF-8 。
在 Ajax 應(yīng)用程序中,有兩種方法可以向服務(wù)器發(fā)送請(qǐng)求內(nèi)容。一種是以“ & 內(nèi)容名稱 = 內(nèi)容值”的形式直接附加在目標(biāo) URL 后面,通過 open() 方法設(shè)置發(fā)送內(nèi)容。另外一種是將要發(fā)送的內(nèi)容作為 send() 方法的參數(shù),內(nèi)容名稱及其值也是成對(duì)出現(xiàn)的,中間用 & 字符隔開。
<!-- page -->
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
