最通用的定義爲:XmlHttp是一套能夠在Javascript、VbScript、Jscript等腳本語言中經過http協議傳送或從接收XML及其餘數據的一套API。XmlHttp最大的用處是能夠更新網頁的部份內容而不須要刷新整個頁面。
來自MSDN的解釋:XmlHttp提供客戶端同http服務器通信的協議。客戶端能夠經過XmlHttp對象(MSXML2.XMLHTTP.3.0) 向http服務器發送請求並使用微軟XML文檔對象模型Microsoft? XML Document Object Model (DOM)處理迴應。 php
如今的絕對多數瀏覽器都增長了對XmlHttp的支持,IE中使用ActiveXObject方式建立XmlHttp對象,其餘瀏覽器如:Firefox、Opera等經過window.XMLHttpRequest來建立xmlhttp對象。 html
onreadystatechange* | 指定當readyState屬性改變時的事件處理句柄。只寫 |
readyState | 返回當前請求的狀態,只讀. |
responseBody | 將回應信息正文以unsigned byte數組形式返回.只讀 |
responseStream | 以Ado Stream對象的形式返回響應信息。只讀 |
responseText | 將響應信息做爲字符串返回.只讀 |
responseXML | 將響應信息格式化爲Xml Document對象並返回,只讀 |
status | 返回當前請求的http狀態碼.只讀 |
statusText | 返回當前請求的響應行狀態,只讀 |
* 表示此屬性是W3C文檔對象模型的擴展.數據庫
abort | 取消當前請求 |
getAllResponseHeaders | 獲取響應的全部http頭 |
getResponseHeader | 從響應信息中獲取指定的http頭 |
open | 建立一個新的http請求,並指定此請求的方法、URL以及驗證信息(用戶名/密碼) |
send | 發送請求到http服務器並接收回應 |
setRequestHeader | 單獨指定請求的某個http頭 |
建立XMLHttpRequest對象
對於Ajax,最核心的一個對象是XMLHttpRequest,全部的Ajax操做都離不開對這個對象的操做
xmlHttp = new XMLHttpRequest();
三、XMLHttpRequest對象相關方法
XMLHttpRequest.open(傳遞方式,地址,是否異步請求)
XMLHttpRequest.onreadystatechange
XMLHttpRequest.responseText(xhr.send(null))數組
與以前衆多DOM操做同樣,建立XHR對象也具備兼容性問題:IE6及以前的版本使用ActiveXObject,IE7以後及其它瀏覽器使用XMLHttpRequest瀏覽器
不但IE6及其以前的版本將XHR做爲一個ActiveXObject運行,並且還存在衆多版本:一開始是Microsoft.XMLHTTP 以後變成Msxml2.XMLHTTP及更新版的Msxml3.XMLHTTP緩存
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腳本發送請求,會發現服務器端腳本其實會被執行服務器
//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就好了!app
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對象獲取錯誤信息。
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);
@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋體"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; text-align: justify; font-family: "Times New Roman"; font-size: 10.5pt; }h3 { margin-top: 13pt; margin-bottom: 13pt; page-break-after: avoid; text-align: justify; line-height: 172%; font-family: "Times New Roman"; font-weight: bold; font-size: 16pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { page: Section0; }
1、同步原理(flase):使用回調函數時,回調函數會插入執行隊列,執行對列得等回調函數執行完纔會依次往下執行(造成堵塞)
2、異步原理(true):使用回調函數時,回調函數會插入執行隊列,執行對列不會等回調函數執行才執行,而是一直往下執行。而回調函數則會跑到執行隊列的最前面。(不造成堵塞)
3、狀態值(state :0.1.2.3.4.)
例子:
4、異步原理例子:(不堵塞代碼執行)
5、同步原理:(堵塞代碼執行)