與以前衆多DOM操做同樣,建立XHR對象也具備兼容性問題:IE6及以前的版本使用ActiveXObject,IE7以後及其它瀏覽器使用XMLHttpRequestjavascript
不但IE6及其以前的版本將XHR做爲一個ActiveXObject運行,並且還存在衆多版本:一開始是Microsoft.XMLHTTP 以後變成Msxml2.XMLHTTP及更新版的Msxml3.XMLHTTPphp
function XHR() { var xhr; try {xhr = new XMLHttpRequest();} catch(e) { var IEXHRVers =["Msxml3.XMLHTTP","Msxml2.XMLHTTP","Microsoft.XMLHTTP"]; for (var i=0,len=IEXHRVers.length;i< len;i++) { try {xhr = new ActiveXObject(IEXHRVers[i]);} catch(e) {continue;} } } return xhr; }
var xhr = XHR(); //open方法 建立一個新的http請求,並指定此請求的方法、URL以及驗證信息(用戶名/密碼) xhr.open("get","test.txt",true); /*第一個參數是請求方式,通常用get與post方法,與form標籤的method相似 第二個參數是請求的URL 第三個參數是請求是同步進行仍是異步進行,true表示異步 調用了open方法僅僅是傳遞了參數而已*/ xhr.send(null);//調用了send方法後纔會發出請求 //而且get方式發送請求時send參數是null
在服務器環境中執行上面的腳本,而且給一個php或asp腳本發送請求,會發現服務器端腳本其實會被執行java
//PHP腳本 $fp =fopen("a.txt","wb"); fwrite($fp,"PHP文件在後臺執行了"); fclose($fp); echo "返回內容!";
上面PHP腳本的返回內容不會直接在頁面上顯示出來,必須要用JS經過XHR對象接收數據庫
var xhr = XHR(); xhr.open("get","test.php",true); xhr.onreadystatechange = callback;//在readystatechange事件上綁定一個函數 //當接收到數據時,會調用readystatechange事件上的事件處理函數 xhr.send(null); functon callback() { //在這裏面沒有使用this.readyState這是由於IE下面ActiveXObject的特殊性 if (xhr.readyState == 4) {//readyState表示文檔加載進度,4表示完畢 alert(xhr.reponseText);//responseText屬性用來取得返回的文本 } }
var xhr =XHR(); alert(xhr.readyState);//0 xhr.open("get","test.htm",true); alert(xhr.readyState);//1 xhr.send(null); alert(xhr.readyState);//IE下會是4,而FF下會是2 //能夠經過readystatechange事件監聽 xhr = XHR(); xhr.onreadystatechange = function () { alert(xhr.readyState);//FF下會依次是1,2,3,4但最後還會再來個1 //IE下則是1,1,3,4 }; xhr.open("get","test.txt",true); xhr.send(null);
從上面能夠看到,對於readyState這個屬性,各個瀏覽器見解也不同,但其實咱們只須要知道當狀態爲4的時候能夠獲取response就好了!瀏覽器
status屬性返回當前請求的http狀態碼,此屬性僅當數據發送並接收完畢後纔可獲取。完整的HTTP狀態碼以下:緩存
事實上,咱們只須要知道狀態爲200的時候(OK)纔讀取response就好了!服務器
responseText 將響應信息做爲字符串返回 . XMLHTTP嘗試將響應信息解碼爲Unicode字符串,XMLHTTP默認將響應數據的編碼定爲UTF-8,若是服務器返回的數據帶BOM(byte-order mark),XMLHTTP能夠解碼任何UCS-2 (big or little endian)或者UCS-4 數據。注意,若是服務器返回的是xml文檔,此屬性並不處理xml文檔中的編碼聲明。你須要使用responseXML來處理。併發
responseXML 將響應信息格式化爲Xml Document對象並返回 . 若是響應數據不是有效的XML文檔,此屬性自己不返回XMLDOMParseError,能夠經過處理過的DOMDocument對象獲取錯誤信息。app
abort 取消當前請求異步
getAllResponseHeaders 獲取響應的全部http頭 每一個http頭名稱和值用冒號分割,並以\r\n結束。當send方法完成後纔可調用該方法。
getResponseHeader 從響應信息中獲取指定的http頭 當send方法成功後纔可調用該方法。若是服務器返回的文檔類型爲"text/xml", 則這句話xmlhttp.getResponseHeader("Content-Type");將返回字符串"text/xml"。可使用getAllResponseHeaders方法獲取完整的http頭信息。
setRequestHeader 單獨指定請求的某個http頭 若是已經存在已此名稱命名的http頭,則覆蓋之。此方法必須在open方法後調用。
GET 請求
//JS var xhr = XHR(); xhr.open("get","test.php?qs=true&userName=abc&pwd=123456",true); xhr.onreadystatechange = function () { if (xhr.readyState==4 && xhr.status ==200) { alert(xhr.responseText); } }; xhr.send(null); //PHP print_r($_GET);
POST 請求
//JS var xhr = XHR(); xhr.open("post","test.php",true); xhr.onreadystatechange = function () { if (xhr.readyState==4 && xhr.status ==200) { alert(xhr.responseText); } }; //比GET請求多了一步 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //另外,數據是經過send方法發送的 xhr.send("qs=true&userName=abc&pwd=123456"); //PHP header("Cache-Control: no-cache, must-revalidate");//可讓瀏覽器不緩存結果 print_r($_POST);
轉自--gaojun