AJAX基礎(二)——XMLHttpRequest對象

在Ajax應用程序中,XmlHttpRequest對象負責將用戶信息以異步通訊地發送到服務器端,並接收服務器返回的響應信息和數據。javascript

XMLHttpRequest簡介html

XMLHttpRequest能夠提供不從新加載頁面的狀況下更新網頁,在頁面加載後在客戶端向服務器請求數據,在頁面加載後在服務器端接受數據,在後臺向客戶端發送數據。XMLHttpRequest 對象提供了對 HTTP 協議的徹底的訪問,包括作出 POST 和 HEAD 請求以及普通的 GET 請求的能力。XMLHttpRequest 能夠同步或異步返回 Web 服務器的響應,而且能以文本或者一個 DOM 文檔形式返回內容。儘管名爲 XMLHttpRequest,它並不限於和 XML 文檔一塊兒使用:它能夠接收任何形式的文本文檔。XMLHttpRequest 對象是名爲 AJAX 的 Web 應用程序架構的一項關鍵功能。java

XMLHttpRequest和Javascript數據庫

Javascript自己並未具有向服務器發送請求的能力,要麼使用window.open()方法從新打開一個頁面向服務器提交請求,要麼使用XMLHttpRequest對象發送請求。不一樣的是,前者是普通的即同步交互模式,然後者是異步交互方式。數組

XMLHttpRequest提供了一系列的屬性和方法,來向服務器發送異步的http請求;在服務器處理用戶請求的過程當中,XMLHttpRequest經過屬性的狀態值來實時反映http請求所處的狀態,並根據這些狀態指示Javascript作相應的處理;當服務器順利完成響應用戶行爲的動做、並將響應數據返回時,XMLHttpRequest提供的response系列方法,能夠將這些響應數據以文本、XML Document對象、Ado Stream對象或者unsigned byte數組的方式組裝起來,提供給Javascript處理。瀏覽器

XMLHttpRequest的五步使用法:緩存

一、 創建XMLHttpRequest對象服務器

二、  註冊回調函數架構

三、  使用open方法社會自和服務器端交互的基本信息app

四、  設置發送的數據,開始和服務器端交互

五、  在回調函數中判斷交互是否結束,響應是否正確,並根據須要過去服務器端返回的數據,更新頁面內容

下面咱們以用戶名確認來實現XMLHttpRequest的五步使用法:

<!DOCTYPE html>

<html>

    <head>

        <title></title>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <script type="text/javascript">

             var xmlhttp;

            function submit(){

                //1.建立XHLHttpRequest對象

                if(window.XMLHttpRequest){

                    //alert("IE7,IE8 ,FireFox。Mozillar、Safari,Opera");

                    //IE7,IE8 ,FireFox。Mozillar、Safari,Opera

                     xmlhttp=new XMLHttpRequest();

                    if(xmlhttp.overrideMimeType){

                        xmlhttp.overrideMimeType("text/xml");

                        

                    }

                }else if(window.ActiveXObject){

                    //IE6,IE6.5 IE5

                    alert("IE6,IE6.5 IE5");

                    var activexName= ['MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.5.0',

                        'MSXML2.XMLHTTP.4.0','msxml2.xmlhttp.3.0','MSXML2.XMLHTTP.2.0',

                        'MSXML2.XMLHTTP.1.0'];

                    for(var i=0; i<activexName.length;i++){

                        try{

                            xmlhttp=new ActiveXObject(activexName[i]);

                            break;

                        }catch(e){

                            

                        }

                    }

                 }

                 if(xmlhttp==undefined||xmlhttp==null){

                     alert("當前瀏覽器不支持穿件XMLHttpRequest對象,請更換瀏覽器");

                     return;

                 }

                 //alert(xmlhttp);

                 //2.註冊回調方法

                 xmlhttp.onreadystatechange=callback;

            

                 //錯誤的寫法callback();

                 

                 //記憶一個固定用法,獲取文本框中用戶輸入的內容

                 var userName=document.getElementById("UserName").value;

                 /*

                  //GET方式交互

                 //設置和服務器端交互的相應參數

                 xmlhttp.open("GET","AjaxServer?name="+userName,true);

                 

                 //4.設置向服務器端發送的數據,啓動和服務器端的交互

                 xmlhttp.send(null);

                 */

                //POST方式交互

                //3.設置和服務器端交互的相應參數

                xmlhttp.open("POST","AjaxServer",true);

                

                //POST方式交互所須要增長的代碼

                xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

                

                //4.設置向服務器端發送的數據,啓動和服務器端的交互

                xmlhttp.send("name="+userName);

                 

            }

            function callback(){

                //5.判斷和服務器端的交互是否完成,還有判斷服務器端是否正確返回了數據

                     

                if(xmlhttp.readyState==4){

                    //表示和服務器端的交互已經完成

//服務器返回的http狀態碼

//200表示「成功」,404表示「未找到」。500表示「服務器內容部錯誤」

                    //alert(xmlhttp.status);

                    if(xmlhttp.status==200){

                        //表示服務器端的響應代碼是200,正確的返回了數據

                        //純文本數據的接受方法

                        var message=xmlhttp.responseText;

                        //XML數據對應的DOM對象的接受方法

                        //使用前提是,服務器端須要設置content-type爲text/xml

                        //var domXml=xmlhttp.responseXML;

                        alert("bb");

                        //記憶想div標籤填充文本內容的方法

                        var div=document.getElementById("message");

                        div.innerHTML=message;

                       

                    }

                }

            }

        </script>

    </head>

    <body>

        <input type="text" id="UserName"/>

        <input type="button" value="校驗用戶名" onclick="submit()"/>

        <br/>

        <div id="message"></div>

    </body>

</html>


XMLHttpRequest的詳細屬性和方法

方法和屬性 描述

OpenString method,String url,Boolean ansynch,String username,String password)

1. 指定和服務器端交互的HTTP方法,URL地址及其餘請求信息。

2. 其中method表示HTTP請求方法。支持全部HTTP的方法,通常使用「GET」「POST」url表示請求的服務器的地址,Asynch表示是否採起異步方式,true表示異步,false表示同步,後兩個參數能夠不指定,usrenamepassword分別表示用戶名和密碼,提供http認證機制須要的用戶名和密碼

Send(content)

1. 向服務器發出請求,若是採用異步方式,該方法會當即返回

2. Content能夠不指定或者指定爲null表示不發送數據,其內容可使DOM對象,輸入流或是字符串

GET 仍是 POST?

與 POST 相比,GET 更簡單也更快,而且在大部分狀況下都能用。

然而,在如下狀況中,請使用 POST 請求:

  • 沒法使用緩存文件(更新服務器上的文件或數據庫)

  • 向服務器發送大量數據(POST 沒有數據量限制)

  • 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠

setRequestHeader(String header,String value) 設置HTTP請求中的指定頭部header的值爲value。
次方法需在open方法之後調用
getAllReponseHeader()

1. 返回包含HTTP的全部響應頭包括Content-Length,Date,URI等內容

2. 返回值是一個字符串,包含全部頭信息,其中每個鍵名和鍵值用冒號分開,每一組鍵之間用CR和LF(回車加換行符)來分隔

GetResponseHeader(String header) 返回HTTP響應頭中指定的鍵名header對應的值
Abort() 中止當前http請求,對應的XMLHttpRequest對象會復位到未初始化的狀態
responseText 服務器響應的文本內容
ResponseXML 服務器響應的XML內容對應的DOM對象
Status

服務器返回的http狀態碼

200表示「成功」,404表示「未找到」。500表示「服務器內容部錯誤

statusText 服務器返回狀態碼的文本信息
readyState

表示XMLHttpRequest對象的狀態

0=未初始化。對象已建立,未調用open

1=open方法成功調用之後。Send方法未調用

2=send方法已經調用,還沒有開始接受數據

3=正在接受數據。Http響應頭信息已經接受,響應數據還沒有接受完成。

4=完成。響應數據接受完成

Onreadystatechage 請求狀態改變的時間觸發器(readyState變化時會調用這個屬性上註冊的javascript函數)

XMLHttpRequest的五步使用注意事項:

1. 不一樣瀏覽器中XMLHttpRequest對象創建的方式不一樣:

IE7,IE8,FireFox,Mozilla,Safair,Opera中直接new XMLHttprequest()

IE6,IE5.5,IE5則須要經過某一個正確的ActiveXOject控件的名稱經過new ActiveXObject(控件名)的方式

2. 設置回調函數時,不要在函數名後面加括號。加口號表示將回調函數的返回值註冊給onreadystatechange屬性。正確的方式應該是將回調函數的名字註冊給這個屬性。

實際上每次readySatte的值發生變化的時候,回調函數都會被調用,可是通常咱們只關心狀態4.

若是隻關心正確的響應數據,只要在執行send方法以前設置回調函數便可。可是仍然建議在XMLHttpRequest對象建立後就先設置回調函數,這樣回調函數還能夠處理其餘的狀態。

 

3. open方法最多能夠有五個參數,其中頭三個參數是必須的。

使用GET方式時,請求數據位於url鏈接中,後面的send方法的參數直接寫null就可使用POST方式時,open方法後面須要先調用setRequestHeader方法,來設置Content-Type的值,而後調用send方法,send的參數就是請求的數據。

4. 回調函數中,最好將判斷readyState和status的兩個if條件,分開來寫。readyState的判斷條件位於外層,status的位於內層。

假如他們被放到了同一個if條件中,判斷數據正常返回頁是沒有問題的。可是不便於分別處理服務器端不是200響應的狀況和readyState不是4的狀況。

5. 當服務器端沒有正確返回XML數據時,在Javascript中使用responseXML方式獲取返回的XML數據對應的DOM對象時,FireFox和IE的結果是有差異的。

IE獲取根元素節點爲null,而FireFox獲取根元素節點則是一個表示解析錯誤的元素節點。

XMLHttpRequest 的優點:

在不從新加載頁面的狀況下更新網頁

在頁面已加載後從服務器請求數據

在頁面已加載後從服務器接收數據

在後臺向服務器發送數據

全部現代的瀏覽器都支持 XMLHttpRequest 對象。比較很差的一點是 IE5,6跟IE7,FIREFOX等瀏覽器之間有兩種不一樣的XMLHttpRequest對象的實現方法。

相關文章
相關標籤/搜索