在《Pragmatic ajax(動態網站靜態化) A Web 2.0 Primer 》中偶然看到對readyStae狀態的介紹,感覺這個介紹很實在,摘譯如下:
0: (Uninitialized) the send( ) method has not yet been invoked.
1: (Loading) the send( ) method has been invoked, request in progress.
2: (Loaded) the send( ) method has completed, entire response received.
3: (Interactive) the response is being parsed.
4: (Completed) the response has been parsed, is ready for harvesting.
0 - (未初始化)還沒有呼叫send()方法
1 - (載入)已呼叫send()方法,正在傳送請求
2 - (載入完成)send()方法執行完成,已接收到全部回應內容
3 - (交互)正在解析回應內容
4 - (完成)回應內容解析完成,可以在客戶端呼叫了
對於readyState的這五種狀態,其他書中大都語焉不詳。像是《Foundations of ajax(動態網站靜態化)》中,只在書中的表2-2簡單地列舉了狀態的「名稱」-The state of the request. The five possible values are 0 = uninitialized, 1 = loading, 2 = loaded, 3 = interactive, and 4 = complete。而《ajax(動態網站靜態化) in Action》中好像根本就沒有提到這5種狀態的細節。 《Professional ajax(動態網站靜態化)》中雖不盡人意,但還是有可取之處:
There are five possible values for readyState:
0 (Uninitialized): The object has been created but the open() method hasn't been called.
1 (Loading): The open() method has been called but the request hasn't been sent.
2 (Loaded): The request has been sent.
3 (Interactive). A partial response has been received.
4 (Complete): All data has been received and the connection has been closed.
readyState有五種可能的值:
0 (未初始化): (xml(標準化越來越近了)HttpRequest)物件已經創建,但還沒有呼叫open()方法。
1 (載入):已經呼叫open() 方法,但尚未傳送請求。
2 (載入完成): 請求已發送完成。
3 (交互):可以接收到部分回應資料。
4 (完成):已經接收到了全部數據,並且連接已經關閉。
在《Understanding ajax(動態網站靜態化): Using JavaScript to Create Rich Internet Applications》中,則用下表進行了說明:
readyState Status Code
Status of the xml(標準化越來越近了)HttpRequest Object
(0) UNINITIALIZED
未初始化 The object has been created but not initialized. (The open method has not been called.)
(xml(標準化越來越近了)HttpRequest)物件已經創建,但尚未初始化(還沒有呼叫open方法)。
(1) LOADING
載入 The object has been created, but the send method has not been called.
(xml(標準化越來越近了)HttpRequest)物件已經創建,但尚未呼叫send方法。
(2) LOADED
載入完成 The send method has been called, but the status and headers are not yet available.
已經呼叫send方法,(HTTP回應)狀態及頭部還不可用。
(3) INTERACTIVE
互動 Some data has been received. Calling the responseBody and responseText properties at this state to obtain partial results will return an error, because status and response headers are not fully available.
(4) COMPLETED
完成 All the data has been received, and the complete data is available in the responseBody and responseText properties.
已經接收了全部數據,並且在responseBody和responseText屬性中可以提取到完整的數據。
readyState 狀態說明
(0)未初始化
此階段確認xml(標準化越來越近了)HttpRequest物件是否創建,並為呼叫open()方法進行未初始化作好準備。值為0表示物件已經存在,否則瀏覽器會報錯-物件不存在。
(1)載入
此階段對xml(標準化越來越近了)HttpRequest物件進行初始化,即呼叫open()方法,根據參數(method,url,true)完成物件狀態的設定。並呼叫send()方法開始向服務端發送請求。值為1表示正在傳送請求至服務端。
(2)載入完成
此階段接收伺服器端的回應資料。但獲得的還只是服務端回應的原始數據,並不能直接在客戶端使用。值為2表示已接收完全部響應資料。並為下一階段對資料解析作好準備。
(3)交互
此階段解析接收到的伺服器端回應資料。即根據伺服器端回應頭部回傳的MIME類型把資料轉換成能透過responseBody、responseText或responsexml(標準化越來越近了)屬性存取的格式,為在客戶端調用作好準備。狀態3表示正在解析資料。
(4)完成
此階段確認全部資料都已解析為客戶端可用的格式,解析已完成。值為4表示資料解析完畢,可以透過xml(標準化越來越近了)HttpRequest物件的對應屬性取得資料。
概而括之,整個xml(標準化越來越近了)HttpRequest物件的生命週期應該包含以下階段:
創建-初始化請求-發送請求-接收資料-解析資料-完成
在具體應用中,明確了readyState的五個狀態(xml(標準化越來越近了)HttpRequest對象的生命週期各個階段)的含義,就可以消除對ajax(動態網站靜態化)核心的神秘感(語焉不詳的背後要嘛是故弄玄虛,製造神秘感;要嘛就是「以其昏昏,使人昭昭」),迅速把握其實質,對減少學習中的挫折感和增強自信心都極為有益。
例如,透過如下範例:
//回呼函數內部程式碼片段
if (xml(標準化越來越近了)Http.readyState==4)
{
var span = document.createElement(“span”);
span.innerHTML = states[xml(標準化越來越近了)Http.readyState];
document.body.appendChild(span);
if (xml(標準化越來越近了)Http.status == 200)
{
var xml(標準化越來越近了)doc = xml(標準化越來越近了)Http.responsexml(標準化越來越近了);
//其他程式碼
}
//別忘記銷毀,防止記憶體洩漏
xml(標準化越來越近了)Http = null;
}else{
var span = document.createElement(“span”);
span.innerHTML = states[xml(標準化越來越近了)Http.readyState];
document.body.appendChild(span);
}結果如下:
正在初始化請求…成功!
正在發送請求…成功!
正在接收資料…完成!
正在解析資料…完成!