天天看點

Ajax 請求的五大步驟

大家好,又見面了,我是你們的朋友全棧君。

什麼是 Ajax

Ajax : 即 異步JavaScript 和 XML ,Ajax 是一種用于建立快速動态網頁的技術。通過在背景與伺服器進行少量資料交換,Ajax 可以使網頁實作異步更新。這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新,而傳統不使用Ajax的網頁,如果需要更新内容,必需重載整個網頁面。

Ajax 的工作原理

Ajax 的工作原理相當關于在使用者和伺服器之間加了一個中間層(Ajax 引擎),使使用者操作與伺服器響應異步化,并不是所有的使用者請求都送出給伺服器。像一些資料驗證和資料處理等都交給Ajax 引擎自己來做,隻有确定需要從伺服器讀取新資料時再由Ajax 引擎代為向伺服器送出請求。

傳統的Web 應用模型

Ajax 請求的五大步驟

Ajax Web 應用模型

Ajax 請求的五大步驟

實作 AJAX 的基本步驟

要完整實作一個AJAX 異步調用和局部重新整理,通常需要以下幾個步驟:

1、建立XML HttpRequest 對象,即建立一個異步調用對象。

2、建立一個新的HTTP 請求,并指定該HTTP 請求的方法,URL及驗證資訊

3、設定響應HTTP請求狀态變化的函數。

4、發送HTTP 請求。

5、擷取異步調用傳回的資料。

6、使用JavaScript和DOM 實作局部重新整理

1、建立XMLHttpRequest對象

不同浏覽器使用得異步調用對象有所不同,在 IE浏覽器中異步調用使用得是XMLHTTP元件中的XMLHttpRequest對象,而在 Netscape 、 Firefox 浏覽器 中則直接使用 XMLHttpRequest 元件,是以,在不同浏覽器中建立 XMLHttpRequest 對象的方式有所不同。

在IE浏覽器中建立XMLHttpRequest對象的方式

var XMLHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");           

複制

在 Netscape 、 Firefox 浏覽器 中建立 XMLHttpRequest 對象的方式

var XMLHttpRequest = new XMLHttpRequest();           

複制

由于無法确定使用者使用的是什麼浏覽器,是以在建立XMLHttpRequest對象時,最好把兩種方法都寫上,如下代碼所示。

var xmlHttpRequest ;  // 建立一個變量,用于存放 XMLHttpRequest 對象
function createXMLHttpRequest() { 
    
    if(window.ActiveXObject()){ 
     // 判斷是否是IE浏覽器
        xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP")
    }
    else if(window.XMLHttpRequest){ 
     // 判斷是否是 Netscape 或者其它 支援 XMLHttpRequest 元件的浏覽器
        xmlHttpRequest = new XMLHttpRequest()
    }
 }
 createXMLHttpRequest()  // 調用建立對象的方法           

複制

如果浏覽器既不支援ActiveX控件,也不支援XMLHttpRequest元件,那麼就不會對xmlHttpRequest變量指派.

2、建立HTTP 請求

建立 XMLHttpRequest 對象後,必須為 該對象建立HTTP 請求,用于說明 XMLHttpRequest 對象從哪裡擷取資料。

XMLHttpRequest.open(method,URL,async,username,password)           

複制

各參數的解析:

1、method 參數是用于請求的 HTTP 方法。值包括 GET 、POST、HEAD、PUT、DELETE(不區分大小寫)

2、url 參數是請求的主體。大多數浏覽器實施了一個同源安全政策,并且要求這個URL 與包含腳本的文本具有相同的主機名和端口

3、async 參數訓示請求使用應該異步執行。如果這個參數為 false,代表請求是同步的,後續對 send() 的調用将阻塞,直到響應完全接受;如果這個參數是 true 或省略,請求是異步的,且通常需要一個 onreadystatechange 事件句柄。

4、username 和 password 參數是可選的,為 url 所需的授權提供認證資格。如果指定了,它們會覆寫 url 自己指定的任何資格。

3、設定響應HTTP 請求狀态變化的函數

建立完 HTTP 請求之後,就可以将HTTP請求發送給Web 伺服器了,發送 HTTP 請求的目的是為了接受從伺服器中傳回的資料。從建立XMLHttpRequest對象,到發送資料、接收資料,一共會經曆5種狀态

1、未初始化狀态。在建立完XMLHttpRequest對象時,該對象處于未初始化狀态,此時XMLHttpRequest對象的readyState屬性值為0。

2、初始化狀态。在建立完XMLHttpRequest對象後使用open()方法建立了HTTP請求時,該對象處于初始化狀态。此時XMLHttpRequest對象的readyState屬性值為1。

3、發送資料狀态。在初始化XMLHttpRequest對象後,使用send()方法發送資料時,該對象處于發送資料狀态,此時XMLHttpRequest對象的readyState屬性值為2。

4、接收資料狀态。Web伺服器接收完資料并進行處理完畢之後,向用戶端傳送傳回的結果。此時,XMLHttpRequest對象處于接收資料狀态,XMLHttpRequest對象的readyState屬性值為3。

5、完成狀态。XMLHttpRequest對象接收資料完畢後,進入完成狀态,此時XMLHttpRequest對象的readyState屬性值為4。此時接收完畢後的資料存入在用戶端計算機的記憶體中,可以使用responseText屬性或responseXml屬性來擷取資料。

XMLHttpRequest對象 隻有完後了以上5個步驟後,才可以擷取從伺服器端傳回的資料,是以要想從伺服器端獲得傳回的資料,就必須要先判斷 XMLHttpRequest 對象的狀态。

XMLHttpRequest 對象可以響應 readystatechange 事件,該事件在 XMLHttpRequest 對象狀态改變時激發,也就是在 readyState 屬性發生變化時,是以可以通過 readystatechange 事件調用一個函數,在函數裡判斷 XMLHttpRequest 對象的 readyState 屬性值,如果readyState === 4 則使用 responseText 屬性或 responseXml 屬性來擷取資料。

XMLHttpRequest.onreadystatechange = getData;  // 設定 XMLHttpRequest 對象狀态發生改變時調用的函數
function getData(){ 
   
    // 判斷XMLHttpRequest對象的readyState屬性值是否為 4 ,如果為4則表示異步調用完成
    if(xmlHttpRequest.readyState === 4){ 
   
        // 擷取資料的語句
    }
 }           

複制

4、設定擷取伺服器傳回資料的語句

如果XMLHttpRequest對象的readyState屬性值等于4,表示異步調用過程完畢。這時候就可以擷取資料了。異步調用過程完畢,并不代表異步調用成功了,如果要判斷異步調用是否成功,還要判斷 XMLHttpRequest 對象的status屬性值,隻有status === 200 ,才表示異步調用成功。

如果HTML檔案不是在Web 伺服器上運作,而是在本地運作,則 xmlHttpRequest.status 的傳回值為 0 ,

XMLHttpRequest.onreadystatechange = getData;  // 設定 XMLHttpRequest 對象狀态發生改變時調用的函數
function getData(){ 
   
    // 判斷XMLHttpRequest對象的readyState屬性值是否為 4 ,如果為4則表示異步調用完成
    if(xmlHttpRequest.readyState === 4){ 
   
        if(xmlHttpRequest.status === 200 || xmlHttpRequest.status === 0 ){ 
   
            // 擷取資料的語句
            document.write(xmlHttpRequest.responseText);//将傳回結果以字元串形式輸出
        }
    }
 }           

複制

5、發送HTTP請求

經過上面四個步驟後,就可以将HTTP 請求發到Web 伺服器上去了,使用 XMLHttpRequest 的send() 方法。

XMLHttpRequest.send(data)  
// 其中data是個可選參數,如果請求的資料不需要參數,即可以使用null來替代。           

複制

執行個體代碼:

<html>
<head>
<title>AJAX執行個體</title>
<script language="javascript" type="text/javascript">    
    var xmlHttpRequest;  //定義一個變量用于存放XMLHttpRequest對象
    //定義一個用于建立XMLHttpRequest對象的函數
    function createXMLHttpRequest(){ 
   
        if(window.ActiveXObject){ 
   //IE浏覽器的建立方式
            xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }else if(window.XMLHttpRequest){ 
   //Netscape浏覽器中的建立方式
            xmlHttpRequest = new XMLHttpRequest();
        }
    }
    //響應HTTP請求狀态變化的函數
    function httpStateChange(){ 
   
        if(xmlHttpRequest.readyState == 4){ 
   //判斷異步調用是否成功,若成功開始局部更新資料
            if(xmlHttpRequest.status == 200||xmlHttpRequest.status == 0) { 
   
                var node = document.getElementById("myDIv");//查找節點
                node.firstChild.nodeValue = xmlHttpRequest .responseText;//更新資料
            } else { 
   //如果異步調用未成功,彈出警告框,并顯示出錯資訊
                alert("error:HTTP狀态碼為:"+xmlHttpRequest.status + ",HTTP狀态資訊為:" + xmlHttpRequest.statusText);
            }
        }
    }
    //異步調用伺服器段資料
    function getData(name,value){ 
    
        createXMLHttpRequest();//建立XMLHttpRequest對象
        if(xmlHttpRequest!=null){ 
        
            xmlHttpRequest.open("get","ajax.text",true);//建立HTTP請求
            xmlHttpRequest.onreadystatechange = httpStateChange;//HTTP請求狀态變化的函數 
            xmlHttpRequest.send(null);//發送請求
        }
    }
</script>
</head>
<body>
    <div id="myDiv">原資料</div>
    <input type = "button" value = "更新資料" onclick = "getData()">
</body>
</html>           

複制

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/145346.html原文連結:https://javaforall.cn