readyState屬性
發(fā)送Ajax異步請求之后喜爷,我們需要知道這個請求處于什么階段巨坊,此時灾票,我們可以檢測readyState
屬性晋控,該屬性表示請求/響應過程的當前活動階段汞窗。它的可取值有如下幾種:
- 0: 未初始化。 尚未調用
open()
方法赡译。 - 1: 啟動仲吏。 已經調用open()方法,但蝌焚,尚未調用
send()
方法 - 2: 發(fā)送裹唆。 已經調用send()方法,但只洒,尚未接收到響應
- 3: 接收许帐。 已經接收到部分響應數據
- 4: 完成。 已經接收到全部響應數據毕谴,而且已經可以在客戶端使用了成畦。
readyState
屬性的每一次變化,都會觸發(fā)一次readyStateChange
事件涝开,我們可以利用這個事件來檢測每次狀態(tài)變化后的readyState
值循帐。通常,我們只對 readyState值為4的階段感興趣忠寻,因此惧浴,這個階段下,所有數據都已經準備就緒奕剃。
注意:onreadystatechange
事件處理程序的指定衷旅,必須在調用open()
方法之前,才能夠保證跨瀏覽器的兼容性
var xhr = new XMLHttpRequest();
// 之前我們提到過纵朋,這種寫法只支持到IE7+柿顶,如對低版本IE有特別要求,需要再做一些兼容處理
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if( (xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
alert(xhr.responseText);
}
else{
alert('fail, ' + xhr.status);
}
}
}
xhr.open('get', 'example.txt', true);
xhr.send(null);
以上代碼利用DOM 0級方法
為XHR對象添加了事件處理程序操软,原因是:并非所有瀏覽器都支持DOM 2級方法
嘁锯。
本例中,onreadystatechange
事件處理程序中,直接使用xhr對象
家乘,而沒有使用this
對象蝗羊,因為onreadystatechange
事件處理程序的作用域問題,在此處使用this對象仁锯,會出錯耀找。
abort方法
在接收到響應之前,可以調用 abort()
方法來取消異步請求业崖。
xhr.abort();
該方法被調用之后野芒,XHR對象會停止觸發(fā)事件,而且也不再允許訪問任何與響應相關的對象屬性双炕。在終止請求之后狞悲,還應該對XHR對象進行解引用操作。由于內存原因妇斤,不建議重用XHR對象摇锋。
HTTP頭部信息
XHR對象提供了操作頭部信息的方法,包括對請求頭部和響應頭部的操作站超。
默認情況下乱投,發(fā)送XHR請求的同時,還會發(fā)送以下頭部信息:
- Accept: 瀏覽器能夠處理的內容類型
- Accept-Charset: 瀏覽器能夠顯示的字符集
- Accept-Encoding: 瀏覽器能夠處理的壓縮編碼
- Accept-Language: 瀏覽器當前設置的語言
- Connection: 瀏覽器與服務器之間的連接類型
- Cookie: 當前頁面的任何Cookie
- Host: 發(fā)出請求的頁面顷编,所在的域
- Referer: 發(fā)出請求的頁面的URI戚炫。注:HTTP規(guī)范把這個單詞拼錯了,如今一直沿用媳纬。正確應該是 referrer
- User-Agent: 瀏覽器的用戶代理字符串
setRequestHeader()
setRequestHeader()
方法的調用双肤,必須在open()
方法調用之后,并且在send()
方法調用之前钮惠。該方法接收2個參數:頭部字段的名稱茅糜、頭部字段的值。比如:
xhr.open('get', 'example.txt', true);
xhr.setRequestHeader("MySite", "4455q.com");
xhr.send(null);
建議使用自定義的頭部信息素挽,而不是去重寫默認的頭部信息蔑赘,因為,部分瀏覽器不允許這樣的操作预明。
getResponseHeader()
getResponseHeader
方法可以取得響應頭部信息缩赛,該方法接收的參數就是頭部字段名稱。
var mySite = xhr.getResponseHeader('MySite');
// 4455q.com
getAllResponseHeaders()
var allHeaders = xhr.getAllResponseHeaders();
在服務器端撰糠,也可以利用頭部信息向瀏覽器發(fā)送額外的結構化數據酥馍。
在沒有自定義信息的情況下,getAllResponseHeaders()
方法通常會返回如下所示的多行文本內容:
Date: Sun, 14 Nov 2004 18:04:22 GMT
Server: Apache/1.3.29 (Unix)
Vary: Accept
X-Powerd-By: PHP/4.3.8
Connection: close
Content-Type: text/html; charset=iso-8859-1
原文鏈接:http://www.4455q.com/ajax-comet-javascript-chapter21-note2.html