AJAX學習筆記1:XHR對象介紹

建立Ajax對象的跨瀏覽器兼容方法

Ajax 技術的核心是 XMLHttpRequest 對象(簡稱 XHR),這是由微軟首先引入的一個特性,其餘瀏覽器提供商後來都提供了相同的實現。IE5 是第一款引入 XHR 對象的瀏覽器。在 IE5 中, XHR 對象是經過 MSXML 庫中的一個 ActiveX對象實現的。所以,在 IE 中可能會遇到三種不一樣版本的 XHR 對象,即 MSXML2.XMLHttp、MSXML2.XMLHttp.3.0 和 MXSML2.XMLHttp.6.0。所以,建立XHR對象應該是用一個函數:php

//適用於 IE7 以前的版本
function createXHR(){
    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 = versions[i];
                break;
            } catch (ex){
                //跳過
            }
        }
    }
    return new ActiveXObject(arguments.callee.activeXString);
}

鑑於IE7+、 Firefox、 Opera、 Chrome 和 Safari 都支持原生的 XHR 對象,在這些瀏覽器中建立 XHR 對象要像下面這樣使用 XMLHttpRequest 構造函數。瀏覽器

var xhr = new XMLHttpRequest();

在必須支持IE7如下版本時,必須使用如下函數:緩存

function createXHR(){
    /*若是瀏覽器支持原生XMLHttpRequest對象,返回用原生對象建立的XMLHttpRequest對象*/
    if (typeof XMLHttpRequest != "undefined"){
        return new XMLHttpRequest();
    } else if (typeof ActiveXObject != "undefined"){
     //不然使用MSXML庫的ActiveX對象建立
    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 = versions[i];
                break;
            } catch (ex){
                //跳過
            }
        }
    }
    return new ActiveXObject(arguments.callee.activeXString);
    } else {   //都不支持則返回錯誤
    throw new Error("No XHR object available.");
    }
}

建立對象的瀏覽器兼容方式是 var xhr = createXHR();服務器

XHR對象的兩個方法

open():它接受 3 個參數:要發送的請求的類型("get"、 "post"等) 、請求的 URL 和表示是否異步發送請求的布爾值(true表明異步,false表明同步,默認是是異步)。下面就是調用這個方法的例子。
xhr.open("get", "example.php", false);
調用 open()方法並不會真正發送請求,而只是啓動一個請求以備發送。具體發送請求須要使用.send()方法。app

send()方法:
xhr.open("get", "example.txt", false);
xhr.send(null);
這裏的 send()方法接收一個參數,即要做爲請求主體發送的數據。若是不須要經過請求主體發送數據,則必須傳入 null,由於這個參數對有些瀏覽器來講是必需的。異步

在收到響應後,響應的數據會自動填充 XHR 對象的屬性,相關的屬性簡介以下。
 responseText:做爲響應主體被返回的文本。
 responseXML:若是響應的內容類型是"text/xml"或"application/xml",這個屬性中將保
存包含着響應數據的 XML DOM 文檔。對於非XML數據,responseXML的值是null。
status:響應的 HTTP 狀態。200~300之間是正常響應,304表示請求的資源未修改,所以能夠使用瀏覽器中緩存的數據,也即響應有效。
 statusText: HTTP 狀態的說明。函數

readyState 屬性

XHR 對象的 readyState 屬性表示請求/響應過程的當前活動階段。這個屬性可取的值以下。
 0:未初始化。還沒有調用 open()方法。
 1:啓動。已經調用 open()方法,但還沒有調用 send()方法。
 2:發送。已經調用 send()方法,但還沒有接收到響應。
 3:接收。已經接收到部分響應數據。
4:完成。已經接收到所有響應數據,並且已經能夠在客戶端使用了。
只要 readyState 屬性的值由一個值變成另外一個值,都會觸發一次 onreadystatechange 事件。能夠利用這個事件來檢測每次狀態變化後 readyState 的值。一般,咱們只對 readyState 值爲 4 的階段感興趣,由於這時全部數據都已經就緒。不過,必須在調用 open()以前指定 onreadystatechange事件處理程序才能確保跨瀏覽器兼容性。使用DOM0級事件處理程序的代碼以下:post

var xhr = createXHR();
xhr.onreadystatechange = function(){
    if (xhr.readyState == 4){ //每次readyState改變都檢查一次,僅當4時才真正做用
            //若是狀態碼>200且<300,或者爲304,輸出響應文本
        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); //添加onreadystatechange事件後使用open()方法
xhr.send(null);

XHR的兩種請求方式:GET and POST

GET請求:
GET 是最多見的請求類型,最經常使用於向服務器查詢某些信息。必要時,能夠將查詢字符串參數追加到 URL 的末尾,以便將信息發送給服務器。對 XHR 而言,位於傳入 open()方法的 URL 末尾的查詢字符串必須通過正確的編碼才行。使用 GET 請求常常會發生的一個錯誤,就是查詢字符串的格式有問題。查詢字符串中每一個參數的名稱和值都必須使用 encodeURIComponent()進行編碼,而後才能放到 URL 的末尾;並且全部名-值對兒都必須由和號(&)分隔:編碼

xhr.open("get", "example.php?name1=value1&name2=value2", true);

POST請求:一般用於向服務器發送應該被保存的數據。 POST 請求應該把數據做爲請求的主體提交,而 GET 請求傳統上不是這樣。 POST 請求的主體能夠包含很是多的數據,
並且格式不限。在 open()方法第一個參數的位置傳入"post",就能夠初始化一個 POST 請求,以下面的例子所示。設計

xhr.open("post", "example.php", true);

發送 POST 請求的第二步就是向 send()方法中傳入某些數據。因爲 XHR 最初的設計主要是爲了處理 XML,所以能夠在此傳入 XML DOM 文檔,傳入的文檔經序列化以後將做爲請求主體被提交到服務器。固然,也能夠在此傳入任何想發送到服務器的字符串。

相關文章
相關標籤/搜索