XMLHttpRequest對象
我對XMLHttpRequest對象使用的理解:
1.創建:
var xhr=new XMLHttpRequest();
2.打開:
xhr.open("get","example.php",false);
open()接受三個參數:要發送的請求的類型(”get”、”post”等)、請求的URL和表示是否異步發送請求的布爾值。
這行代碼會啓動一個針對example.php的GET請求。有關這行代碼,需要說明兩點:一是URL相對於執行代碼的當前頁面(當然也可以使用絕對路徑);二是調用open()並不會真正發送請求,而只是啓動一個請求以備發送。
3.發送:
xhr.send(null);
這裏的send()方法接收一個參數,即要作爲請求主體發送的數據。如果不需要通過請求主體發送數據,則必須傳入null,因爲這個參數對有些瀏覽器來說是必需的。調用send()之後,請求就會被分派到服務器。
注意:
由於在IE7以前的版本中,可能會遇到三種不同版本的XHR對象,而IE7+、Firefox、Opera、Chrome和Safari都支持原生的XHR對象。所以可以使用下面的代碼在所有瀏覽器中創建XHR對象:
function createXHR(){
if(typeof XMLHttpRequest !="undefined"){
return new XMLHttpRequest();
}else if(typeof ActiveXObject !="undefined"){
if(typeof arguments.callee.activeXString != "string"){
var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],i,len;
for(i=0,len=versions.length;i<len;i++){
try{
new ActiveXObject(versions[i]);
arguments.callee.activeXString=version[i];
break;
}catch (ex){
//跳過
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else{
throw new Error("No XHR object avilable.");
}
}
如果open()中的第三個參數是false,也就是說如果請求是同步的,JavaScript代碼會等到服務器響應之後再繼續執行。在收到響應後,響應的數據就會自動填充XHR對象的屬性,相關的屬性簡介如下:
- responseText: 作爲響應主體被返回的文本。
- responseXML: 如果響應的內容類型是”text/xml”或”application/xml”,這個屬性中將保存包含着響應數據的XML
- status: 響應的HTTP狀態
- statusText: HTTP狀態的說明
當發送異步請求時,可以檢測XHR對象的readyState屬性,該屬性表示請求/響應過程的當前活動階段。這個屬性可取的值如下:
- 0:未初始化。尚未調用open()方法
- 1:啓動。已經調用open()方法,但尚未調用send()方法。
- 2:發送。已經調用send()方法,但尚未接收到響應。
- 3:接收。已經接收到部分響應數據。
- 4:完成。已經接收到全部響應數據,而且已經可以在客戶端使用了。
var xhr=createXHR();
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
if((xhr.status>=200 && xhr.status<300)||xhr.status==304){
alert(xhr.responseText);
}else{
alert("Request was unsuccessful:"+xhr.status);
}
}
};
xhr.open("get","example.txt",true);
xhr.send(null);
另外,在接收到響應之前還可以調用abort()方法來取消異步請求,如下:
xhr.abort();
調用這個方法後,XHR對象會停止觸發時間,而且也不再允許訪問任何與響應有關的對象屬性。在終止請求之後,還應該對XHR對象進行解引用操作。由於內存原因,不建議重用XHR對象。