1. 程式人生 > >關於XMLHttpRequest的readyState屬性的五個狀態

關於XMLHttpRequest的readyState屬性的五個狀態

昨天做了一個利用ajax實現頁面無重新整理的從伺服器端獲得時間的例子,當時對於xmlhttprequest物件的readystate的後三個狀態不是很清楚,想了半天,也不明白!後面在程式的不同地方中用alert(xmlhttp.readystate)檢視readystate值的變化,並且請教朋友之後,才弄明白其中的幾個問題:建立xmlhttprequest物件之後沒有呼叫open之前readystate值為0,呼叫open()之後就變為1了,並且此時onreadystatechange函式與open()幾乎是同時執行的。在之後呼叫send方法之後,在startHttpRequest函式中readystate值仍為1,而呼叫send方法之後應該有2,3,4三個狀態,而只有在startHttpRequest函式用alert語句才可以觀察到3個值!這是為什麼呢?這是因為在startHttpRequest函式中當解析到send這一句時,並沒有真正開始執行send執行。只有send執行,才可以在onreadystatechange函式觀察到狀態值的變化。readystate不是傳送的狀態,它是準備傳送的狀態,要把它想像成“人間大炮一級準備、二級準備、放”這樣的口號,不是請求傳送本身。同時xmlhttp也不是監聽伺服器資訊,它是在send的時候獲取伺服器返回的狀態資訊而已,只有一次,監聽則是一直在觀察狀態。至此,心中的疑惑全部解開!


關於readystate五個狀態總結如下:


readyState 狀態    狀態說明
(0)未初始化
此階段確認XMLHttpRequest物件是否建立,併為呼叫open()方法進行未初始化作好準備。值為0表示物件已經存在,否則瀏覽器會報錯--物件不存在。
(1)載入
此階段對XMLHttpRequest物件進行初始化,即呼叫open()方法,根據引數(method,url,true)完成物件狀態的設定。並呼叫send()方法開始向服務端傳送請求。值為1表示正在向服務端傳送請求。
(2)載入完成
此階段接收伺服器端的響應資料。但獲得的還只是服務端響應的原始資料,並不能直接在客戶端使用。值為2表示已經接收完全部響應資料。併為下一階段對資料解析作好準備。
(3)互動
此階段解析接收到的伺服器端響應資料。即根據伺服器端響應頭部返回的MIME型別把資料轉換成能通過responseBody、responseText或responseXML屬性存取的格式,為在客戶端呼叫作好準備。狀態3表示正在解析資料。
(4)完成
此階段確認全部資料都已經解析為客戶端可用的格式,解析已經完成。值為4表示資料解析完畢,可以通過XMLHttpRequest物件的相應屬性取得資料。
概而括之,整個XMLHttpRequest物件的生命週期應該包含如下階段:

建立-初始化請求-傳送請求-接收資料-解析資料-完成