XMLHttpRequest 對象用於在後臺與服務器交換數據。javascript
建立 XMLHttpRequest 對象
全部現代瀏覽器 (IE7+、Firefox、Chrome、Safari 以及 Opera) 都內建了 XMLHttpRequest 對象。
建立 XMLHttpRequest 對象的語法:
xmlhttp=new XMLHttpRequest();
老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 對象:
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");html
<script type="text/javascript"> var xmlhttp; function loadXMLDoc(url) { xmlhttp=null; if (window.XMLHttpRequest) {// code for all new browsers xmlhttp=new XMLHttpRequest(); } else if (window.ActiveXObject) {// code for IE5 and IE6 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } if (xmlhttp!=null) { xmlhttp.onreadystatechange=state_Change; xmlhttp.open("GET",url,true); xmlhttp.send(null); } else { alert("Your browser does not support XMLHTTP."); } } function state_Change() { if (xmlhttp.readyState==4) {// 4 = "loaded" if (xmlhttp.status==200) {// 200 = OK // ...our code here... } else { alert("Problem retrieving XML data"); } } } </script>
onreadystatechange 是一個事件句柄。它的值 (state_Change) 是一個函數的名稱,當 XMLHttpRequest 對象的狀態發生改變時,會觸發此函數。狀態從 0 (uninitialized) 到 4 (complete) 進行變化。僅在狀態爲 4 時,才執行代碼。當 readyState 爲 3 時,它也可能調用屢次。java
HTTP 請求的狀態.當一個 XMLHttpRequest 初次建立時,這個屬性的值從 0 開始,直到接收到完整的 HTTP 響應,這個值增長到 4。瀏覽器
5 個狀態中每個都有一個相關聯的非正式的名稱,下表列出了狀態、名稱和含義:安全
狀態 | 名稱 | 描述 |
---|---|---|
0 | Uninitialized | 初始化狀態。XMLHttpRequest 對象已建立或已被 abort() 方法重置。 |
1 | Open | open() 方法已調用,可是 send() 方法未調用。請求尚未被髮送。 |
2 | Sent | Send() 方法已調用,HTTP 請求已發送到 Web 服務器。未接收到響應。 |
3 | Receiving | 全部響應頭部都已經接收到。響應體開始接收但未完成。 |
4 | Loaded | HTTP 響應已經徹底接收。 |
readyState 的值不會遞減,除非當一個請求在處理過程當中的時候調用了 abort() 或 open() 方法。每次這個屬性的值增長的時候,都會觸發 onreadystatechange 事件句柄。服務器
目前爲止爲服務器接收到的響應體(不包括頭部),或者若是尚未接收到數據的話,就是空字符串。cookie
若是 readyState 小於 3,這個屬性就是一個空字符串。當 readyState 爲 3,這個屬性返回目前已經接收的響應部分。若是 readyState 爲 4,這個屬性保存了完整的響應體。網絡
若是響應包含了爲響應體指定字符編碼的頭部,就使用該編碼。不然,假定使用 Unicode UTF-8。dom
對請求的響應,解析爲 XML 並做爲 Document 對象返回。異步
由服務器返回的 HTTP 狀態代碼,如 200 表示成功,而 404 表示 "Not Found" 錯誤。當 readyState 小於 3 的時候讀取這一屬性會致使一個異常。
這個屬性用名稱而不是數字指定了請求的 HTTP 的狀態代碼。也就是說,當狀態爲 200 的時候它是 "OK",當狀態爲 404 的時候它是 "Not Found"。和 status 屬性同樣,當 readyState 小於 3 的時候讀取這一屬性會致使一個異常。
取消當前響應,關閉鏈接而且結束任何未決的網絡活動。
這個方法把 XMLHttpRequest 對象重置爲 readyState 爲 0 的狀態,而且取消全部未決的網絡活動。例如,若是請求用了太長時間,並且響應再也不必要的時候,能夠調用這個方法。
把 HTTP 響應頭部做爲未解析的字符串返回。
若是 readyState 小於 3,這個方法返回 null。不然,它返回服務器發送的全部 HTTP 響應的頭部。頭部做爲單個的字符串返回,一行一個頭部。每行用換行符 "\r\n" 隔開。
返回指定的 HTTP 響應頭部的值。其參數是要返回的 HTTP 響應頭部的名稱。可使用任何大小寫來制定這個頭部名字,和響應頭部的比較是不區分大小寫的。
該方法的返回值是指定的 HTTP 響應頭部的值,若是沒有接收到這個頭部或者 readyState 小於 3 則爲空字符串。若是接收到多個有指定名稱的頭部,這個頭部的值被鏈接起來並返回,使用逗號和空格分隔開各個頭部的值。
初始化 HTTP 請求參數,例如 URL 和 HTTP 方法,可是並不發送請求。
發送 HTTP 請求,使用傳遞給 open() 方法的參數,以及傳遞給該方法的可選請求體。
向一個打開但未發送的請求設置或添加一個 HTTP 請求。
取消當前響應,關閉鏈接而且結束任何未決的網絡活動。
這個方法把 XMLHttpRequest 對象重置爲 readyState 爲 0 的狀態,而且取消全部未決的網絡活動。例如,若是請求用了太長時間,並且響應再也不必要的時候,能夠調用這個方法。
把 HTTP 響應頭部做爲未解析的字符串返回。
若是 readyState 小於 3,這個方法返回 null。不然,它返回服務器發送的全部 HTTP 響應的頭部。頭部做爲單個的字符串返回,一行一個頭部。每行用換行符 "\r\n" 隔開。
返回指定的 HTTP 響應頭部的值。其參數是要返回的 HTTP 響應頭部的名稱。可使用任何大小寫來制定這個頭部名字,和響應頭部的比較是不區分大小寫的。
該方法的返回值是指定的 HTTP 響應頭部的值,若是沒有接收到這個頭部或者 readyState 小於 3 則爲空字符串。若是接收到多個有指定名稱的頭部,這個頭部的值被鏈接起來並返回,使用逗號和空格分隔開各個頭部的值。
初始化 HTTP 請求參數,例如 URL 和 HTTP 方法,可是並不發送請求。
發送 HTTP 請求,使用傳遞給 open() 方法的參數,以及傳遞給該方法的可選請求體。
向一個打開但未發送的請求設置或添加一個 HTTP 請求。
初始化 HTTP 請求參數
open(method, url, async, username, password)
method 參數是用於請求的 HTTP 方法。值包括 GET、POST 和 HEAD。
url 參數是請求的主體。大多數瀏覽器實施了一個同源安全策略,而且要求這個 URL 與包含腳本的文本具備相同的主機名和端口。
async 參數指示請求使用應該異步地執行。若是這個參數是 false,請求是同步的,後續對 send() 的調用將阻塞,直到響應徹底接收。若是這個參數是 true 或省略,請求是異步的,且一般須要一個 onreadystatechange 事件句柄。
username 和 password 參數是可選的,爲 url 所需的受權提供認證資格。若是指定了,它們會覆蓋 url 本身指定的任何資格。
這個方法初始化請求參數以供 send() 方法稍後使用。它把 readyState 設置爲 1,刪除以前指定的全部請求頭部,以及以前接收的全部響應頭部,而且把 responseText、responseXML、status 以及 statusText 參數設置爲它們的默認值。當 readyState 爲 0 的時候(當 XMLHttpRequest 對象剛建立或者 abort() 方法調用後)以及當 readyState 爲 4 時(已經接收響應時),調用這個方法是安全的。當針對任何其餘狀態調用的時候,open() 方法的行爲是爲指定的。
除了保存供 send() 方法使用的請求參數,以及重置 XMLHttpRequest 對象以便複用,open() 方法沒有其餘的行爲。要特別注意,當這個方法調用的時候,實現一般不會打開一個到 Web 服務器的網絡鏈接。
發送一個 HTTP 請求
send(body)
若是經過調用 open() 指定的 HTTP 方法是 POST 或 PUT,body 參數指定了請求體,做爲一個字符串或者 Document 對象。若是請求體不適必須的話,這個參數就爲 null。對於任何其餘方法,這個參數是不可用的,應該爲 null(有些實現不容許省略該參數)。
這個方法致使一個 HTTP 請求發送。若是以前沒有調用 open(),或者更具體地說,若是 readyState 不是 1,send() 拋出一個異常。不然,它發送一個 HTTP 請求,該請求由如下幾部分組成:
一旦請求發佈了,send() 把 readyState 設置爲 2,並觸發 onreadystatechange 事件句柄。
若是以前調用的 open() 參數 async 爲 false,這個方法會阻塞並不會返回,直到 readyState 爲 4 而且服務器的響應被徹底接收。不然,若是 async 參數爲 true,或者這個參數省略了,send() 當即返回,而且正如後面所介紹的,服務器響應將在一個後臺線程中處理。
若是服務器響應帶有一個 HTTP 重定向,send() 方法或後臺線程自動聽從重定向。當全部的 HTTP 響應頭部已經接收,send() 或後臺線程把 readyState 設置爲 3 並觸發 onreadystatechange 事件句柄。若是響應較長,send() 或後臺線程可能在狀態 3 中觸發 onreadystatechange 事件句柄:這能夠做爲一個下載進度指示器。最後,當響應完成,send() 或後臺線程把 readyState 設置爲 4,並最後一次觸發事件句柄。
setRequestHeader(name, value)
name 參數是要設置的頭部的名稱。這個參數不該該包括空白、冒號或換行。
value 參數是頭部的值。這個參數不該該包括換行。
setRequestHeader() 方法指定了一個 HTTP 請求的頭部,它應該包含在經過後續 send() 調用而發佈的請求中。這個方法只有當 readyState 爲 1 的時候才能調用,例如,在調用了 open() 以後,但在調用 send() 以前。
若是帶有指定名稱的頭部已經被指定了,這個頭部的新值就是:以前指定的值,加上逗號、空白以及這個調用指定的值。
若是 open() 調用指定了認證資格,XMLHttpRequest 自動發送一個適當的 Authorization 請求頭部。可是,你可使用 setRequestHeader() 來添加這個頭部。相似地,若是 Web 服務器已經保存了和傳遞給 open() 的 URL 相關聯的 cookie,適當的 Cookie 或 Cookie2 頭部也自動地包含到請求中。能夠經過調用 setRequestHeader() 來把這些 cookie 添加到頭部。XMLHttpRequest 也能夠爲 User-Agent 頭部提供一個默認值。若是它這麼作,你爲該頭部指定的任何值都會添加到這個默認值後面。
有些請求頭部由 XMLHttpRequest 自動設置而不是由這個方法設置,以符合 HTTP 協議。這包括以下和代理相關的頭部: