XMLHttpRequest對象(簡稱XHR)是ajax技術的核心,ajax可以無刷新更新頁面得益于xhr。
一、創建
var xhr = new XMLHttpRequest();
二、發送請求
open()
xhr.open("get","example.php", false);
1.第一個參數指定請求方式
2.第二個參數url
3.第三個參數表示是否同步,默認為true(異步)
4.如果請求一個受密碼保護的URL,把用于認證的用戶名和密碼作為第4和第5個參數傳遞給open()方法
send()
如果是GET方法,send()方法無參數,或參數為null;如果是POST方法,send()方法的參數為要發送的數據
調用send()方法后,請求被分派到服務器
xhr.open("get", "example.txt", false);
xhr.send(null);
三、接收響應
responseText: 作為響應主體被返回的文本(文本形式)
responseXML: 如果響應的內容類型是'text/xml'或'application/xml',這個屬性中將保存著響應數據的XML DOM文檔(document形式)
status: HTTP狀態碼(數字形式)
statusText: HTTP狀態說明(文本形式)
四、同步
如果接受的是同步響應,則需要將open()方法的第三個參數設置為false,那么send()方法將阻塞直到請求完成。一旦send()返回,僅需要檢查XHR對象的status和responseText屬性即可。
同步請求是吸引人的,但應該避免使用它們。客戶端javascript是單線程的,當send()方法阻塞時,它通常會導致整個瀏覽器UI凍結。如果連接的服務器響應慢,那么用戶的瀏覽器將凍結。
五、異步
如果需要接收的是異步響應,這就需要檢測XHR對象的readyState屬性,該屬性表示請求/響應過程的當前活動階段。
0(UNSENT):未初始化。尚未調用open()方法
1(OPENED):啟動。已經調用open()方法,但尚未調用send()方法
2(HEADERS_RECEIVED):發送。己經調用send()方法,且接收到頭信息
3(LOADING):接收。已經接收到部分響應主體信息
4(DONE):完成。已經接收到全部響應數據,而且已經可以在客戶端使用了
理論上,只要readyState屬性值由一個值變成另一個值,都會觸發一次readystatechange事件。可以利用這個事件來檢測每次狀態變化后readyState的值。
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
//異步接受響應
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
//實際操作
result.innerHTML += xhr.responseText;
}
}
}
//發送請求
xhr.open('get','message.xml',true);
xhr.send();