溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現AJAX異步調用和局部刷新

發(fā)布時間:2022-03-11 14:08:44 來源:億速云 閱讀:159 作者:小新 欄目:開發(fā)技術

這篇文章主要為大家展示了“如何實現AJAX異步調用和局部刷新”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何實現AJAX異步調用和局部刷新”這篇文章吧。

引言

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

(1)創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調用對象.

(2)創(chuàng)建一個新的HTTP請求,并指定該HTTP請求的方法、URL及驗證信息.

(3)設置響應HTTP請求狀態(tài)變化的函數.

(4)發(fā)送HTTP請求.

(5)獲取異步調用返回的數據.

(6)使用JavaScript和DOM實現局部刷新.

1、創(chuàng)建XMLHttpRequest對象

不同的瀏覽器使用的異步調用對象也有所不同,在IE瀏覽器中異步調用使用的是XMLHTTP組件中的XMLHttpRequest對象,而在Netscape、Firefox瀏覽器中則直接使用XMLHttpRequest組件。因此,在不同瀏覽器中創(chuàng)建XMLHttpRequest對象的方式都有所不同.

在IE瀏覽器中創(chuàng)建XMLHttpRequest對象的方式如下所示:

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

在Netscape瀏覽器中創(chuàng)建XMLHttpRequest對象的方式如下所示:

    var xmlHttpRequest = new XMLHttpRequest();

由于無法確定用戶使用的是什么瀏覽器,所以在創(chuàng)建XMLHttpRequest對象時,最好將以上兩種方法都加上.如以下代碼所示:

<html>
           <head>
                         <title>創(chuàng)建XMLHttpRequest對象</title>
                         <script language = "javascript" type = "text/javascript">
                         <!--
                                var xmlHttpRequest;  //定義一個變量,用于存放XMLHttpRequest對象
                                function createXMLHttpRequest()    //創(chuàng)建XMLHttpRequest對象的方法
                               {
                                         if(window.ActiveXObject)   //判斷是否是IE瀏覽器
                                        {
                                                  xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");  //創(chuàng)建IE瀏覽器中的XMLHttpRequest對象
                                        }
                                        else if(window.XMLHttpRequest)    //判斷是否是Netscape等其他支持XMLHttpRequest組件的瀏覽器
                                        {
                                        xmlHttpRequest = new XMLHttpRequest();  //創(chuàng)建其他瀏覽器上的XMLHttpRequest對象
                                         }
                               }
                         -->
                         </script>
                         createXMLHttpRequst();   //調用創(chuàng)建對象的方法
           </head>
           <body>
           </body>

</html>

"if(window.ActiveXObject)"用來判斷是否使用IE瀏覽器.其中ActiveXOject并不是Windows對象的標準屬性,而是IE瀏覽器中專有的屬性,可以用于判斷瀏覽器是否支持ActiveX控件.通常只有IE瀏覽器或以IE瀏覽器為核心的瀏覽器才能支持Active控件.

"else if(window.XMLHttpRequest)"是為了防止一些瀏覽器既不支持ActiveX控件,也不支持XMLHttpRequest組件而進行的判斷.其中XMLHttpRequest也不是window對象的標準屬性,但可以用來判斷瀏覽器是否支持XMLHttpRequest組件.

如果瀏覽器既不支持ActiveX控件,也不支持XMLHttpRequest組件,那么就不會對xmlHttpRequest變量賦值.

2、創(chuàng)建HTTP請求

創(chuàng)建了XMLHttpRequest對象之后,必須為XMLHttpRequest對象創(chuàng)建HTTP請求,用于說明XMLHttpRequest對象要從哪里獲取數據.通??梢允蔷W站中的數據,也可以是本地中其他文件中的數據.

創(chuàng)建HTTP請求可以使用XMLHttpRequest對象的open()方法,其語法代碼如下所示:

       XMLHttpRequest.open(method,URL,flag,name,password)

代碼中的參數解釋如下所示:

method:該參數用于指定HTTP的請求方法,一共有get、post、head、put、delete五種方法,常用的方法為get和post。

URL:該參數用于指定HTTP請求的URL地址,可以是絕對URL,也可以是相對URL。

flag:該參數為可選參數,參數值為布爾型。該參數用于指定是否使用異步方式。true表示異步方式、false表示同步方式,默認為true。

name:該參數為可選參數,用于輸入用戶名。如果服務器需要驗證,則必須使用該參數。

password:該參數為可選參數,用于輸入密碼。如果服務器需要驗證,則必須使用該參數。通常可以使用以下代碼來訪問一個網站文件的內容。

       xmlHttpRequest.open("get","http://www.aspxfans.com/BookSupport/JavaScript/ajax.htm",true);

或者使用以下代碼來訪問一個本地文件內容:

       xmlHttpRequest.open("get","ajax.htm",true);

注意:如果HTML文件放在Web服務器上,在Netscape瀏覽器中的JavaScript安全機制不允許與本機之外的主機進行通信。也就是說,使用open()方法只能打開與HTML文件在同一個服務器上的文件。而在IE瀏覽器中則無此限制(雖然可以打開其他服務器上的文件,但也會有警告提示)。

3、設置響應HTTP請求狀態(tài)變化的函數

創(chuàng)建完HTTP請求之后,應該就可以將HTTP請求發(fā)送給Web服務器了。然而,發(fā)送HTTP請求的目的是為了接收從服務器中返回的數據。從創(chuàng)建XMLHttpRequest對象開始,到發(fā)送數據、接收數據、XMLHttpRequest對象一共會經歷以下5中狀態(tài)。

       ⑴未初始化狀態(tài)。在創(chuàng)建完XMLHttpRequest對象時,該對象處于未初始化狀態(tài),此時XMLHttpRequest對象的readyState屬性值為0。

       ⑵初始化狀態(tài)。在創(chuàng)建完XMLHttpRequest對象后使用open()方法創(chuàng)建了HTTP請求時,該對象處于初始化狀態(tài)。此時XMLHttpRequest對象的readyState屬性值為1。

       ⑶發(fā)送數據狀態(tài)。在初始化XMLHttpRequest對象后,使用send()方法發(fā)送數據時,該對象處于發(fā)送數據狀態(tài),此時XMLHttpRequest對象的readyState屬性值為2。

       ⑷接收數據狀態(tài)。Web服務器接收完數據并進行處理完畢之后,向客戶端傳送返回的結果。此時,XMLHttpRequest對象處于接收數據狀態(tài),XMLHttpRequest對象的readyState屬性值為3。

       ⑸完成狀態(tài)。XMLHttpRequest對象接收數據完畢后,進入完成狀態(tài),此時XMLHttpRequest對象的readyState屬性值為4。此時接收完畢后的數據存入在客戶端計算機的內存中,可以使用responseText屬性或responseXml屬性來獲取數據。

只有在XMLHttpRequest對象完成了以上5個步驟之后,才可以獲取從服務器端返回的數據。因此,如果要獲得從服務器端返回的數據,就必須要先判斷XMLHttpRequest對象的狀態(tài)。

XMLHttpRequest對象可以響應readystatechange事件,該事件在XMLHttpRequest對象狀態(tài)改變時(也就是readyState屬性值改變時)激發(fā)。因此,可以通過該事件調用一個函數,并在該函數中判斷XMLHttpRequest對象的readyState屬性值。如果readyState屬性值為4則使用responseText屬性或responseXml屬性來獲取數據。具體代碼如下所示:

       //設置當XMLHttpRequest對象狀態(tài)改變時調用的函數,注意函數名后面不要添加小括號
       xmlHttpRequest.onreadystatechange = getData;
       //定義函數
       function getData()
       {
              //判斷XMLHttpRequest對象的readyState屬性值是否為4,如果為4表示異步調用完成
              if(xmlHttpRequest.readyState == 4)
              {
                          //設置獲取數據的語句
               }
        }

4、設置獲取服務器返回數據的語句

如果XMLHttpRequest對象的readyState屬性值等于4,表示異步調用過程完畢,就可以通過XMLHttpRequest對象的responseText屬性或responseXml屬性來獲取數據。

但是,異步調用過程完畢,并不代表異步調用成功了,如果要判斷異步調用是否成功,還要判斷XMLHttpRequest對象的status屬性值,只有該屬性值為200,才表示異步調用成功,因此,要獲取服務器返回數據的語句,還必須要先判斷XMLHttpRequest對象的status屬性值是否等于200,如以下代碼所示:

       if(xmlHttpRequst.status == 200)
       {
                //使用以下語句將返回結果以字符串形式輸出
                document.write(xmlHttpRequest.responseText);
                //或者使用以下語句將返回結果以XML形式輸出
                //document.write(xmlHttpRequest.responseXML);
       }

注意:如果HTML文件不是在Web服務器上運行,而是在本地運行,則xmlHttpRequest.status的返回值為0。因此,如果該文件在本地運行,則應該加上xmlHttpRequest.status == 0的判斷。

通常將以上代碼放在響應HTTP請求狀態(tài)變化的函數體內,如以下代碼所示:

       //設置當XMLHttpRequest對象狀態(tài)改變時調用的函數,注意函數名后面不要添加小括號
       xmlHttpRequest.onreadystatechange = getData;
       //定義函數
       function getData()
       {
               //判斷XMLHttpRequest對象的readyState屬性值是否為4,如果為4表示異步調用完成
                if(xmlHttpRequest.readyState==4)
                {
                       //設置獲取數據的語句
                       if(xmlHttpRequest.status == 200 || xmlHttpRequest.status == 0)
                       {
                               //使用以下語句將返回結果以字符串形式輸出
                               document.write(xmlHttpRequest.responseText);
                               //或者使用以下語句將返回結果以XML形式輸出
                               //docunment.write(xmlHttpRequest.responseXML);
                       }
                }
       }

5、發(fā)送HTTP請求

在經過以上幾個步驟的設置之后,就可以將HTTP請求發(fā)送到Web服務器上去了。發(fā)送HTTP請求可以使用XMLHttpRequest對象的send()方法,其語法代碼如下所示:

XMLHttpRequest.send(data)

其中data是個可選參數,如果請求的數據不需要參數,即可以使用null來替代。data參數的格式與在URL中傳遞參數的格式類似,以下代碼為一個send()方法中的data參數的示例:

name=myName&value=myValue

只有在使用send()方法之后,XMLHttpRequest對象的readyState屬性值才會開始改變,也才會激發(fā)readystatechange事件,并調用函數。

6、局部更新

在通過Ajax的異步調用獲得服務器端數據之后,可以使用JavaScript或DOM來將網頁中的數據進行局部更新。常用的局部更新的方式有以下3種:

 ⑴表單對象的數據更新

表單對象的數據更新,通常只要更改表單對象的value屬性值,其語法代碼如下所示:

FormObject.value = "新數值"

有關表單對象的數據更新的示例如以下代碼所示:

        <html>
                  <head>
                               <title>局部更新</title>
                               <script language = "javascript" type = "text/javascript">
                               <!--
                                          function changeData()
                                          {
                                                    document.myForm.myText.value = "更新后的數據"
                                          }
                               -->
                  </head>
                 <body>
                            <form name = "myForm">
                                      <input type = "text" value = "原數據" name = "myText">
                                      <input type = "button" value = "更新數據" onclick = "changeData()">
                            </form>
                 </body>
        </html>

⑵IE瀏覽器中標簽間文本的更新

在HTML代碼中,除了表單元素之外,還有很多其他的元素,這些元素的開始標簽與結束標簽之間往往也會有一點文字(如以下代碼所示),對這些文字的更新,也是局部更新的一部分。

       <p>文字</p>
       <span>文字</span>
       <div>文字</div>
       <label>文字</label>
       <b>文字</b>
       <i>文字</i>

在IE瀏覽器中,innerText或innerHTML屬性可以用來更改標簽間文本的內容。其中innerText屬性用于更改開始標簽與結束標簽之間的純文本內容,而innerHTML屬性用于更改HTML內容。如以下代碼所示: 

      <html>
              <head>
                        <title>局部更新</title>
                        <script language = "javascript" type = "text/javascript">
                                  <!--
                                           function changeData()
                                           {
                                                   myDiv.innerText = "更新后的數據";
                                           }
                                  -->
                        </script>
              </head>

              <body>
                       <div id = "myDive">原數據</div>
                       <input type = "button" value = "更新數據" onclick = "changeData()">
              </body>
       </html>

 ⑶DOM技術的局部刷新

 innerText和innerHTML兩個屬性都是IE瀏覽器中的屬性,在Netscape瀏覽器中并不支持該屬性。但無論是IE瀏覽器還是Netscape瀏覽器,都支持DOM。在DOM中,可以修改標簽間的文本內容。

在DOM中,將HTML文檔中的每一對開始標簽和結束標簽都看成是一個節(jié)點。例如HTML文檔中有一個標簽如下所示,那么該標簽在DOM中稱之為一個“節(jié)點”。

<div id = "myDiv">原數據</div>

 在DOM中使用getElementById()方法可以通過id屬性值來查找該標簽(或者說是節(jié)點),如以下語句所示:

var node = document.getElementById("myDiv");

注意:在一個HTML文檔中,每個標簽中的id屬性值是不能重復的。因此,使用getElementById()方法獲得的節(jié)點是唯一的。

 在DOM中,認為開始標簽與結束標簽之間的文本是該節(jié)點的子節(jié)點,而firstChild屬性可以獲得一個節(jié)點下的第1個子節(jié)點。如以下代碼可以獲得<div>節(jié)點下的第1個子節(jié)點,也就是<div>標簽與</div>標簽之間的文字節(jié)點。

node.firstChild

注意,以上代碼獲得的是文字節(jié)點,而不是文字內容。如果要獲得節(jié)點的文字內容,則要使用節(jié)點的nodeValue屬性。通過設置nodeValue屬性值,可以改變文字節(jié)點的文本內容。完整的代碼如下所示:

      <html>
               <head>
                         <title>局部更新</title>
                         <script language = "javascript" type = "text/javascript">
                         <!--
                                   function changeData()
                                   {
                                             //查找標簽(節(jié)點)
                                             var node = document.getElementById("myDiv");
                                             //在DOM中標簽中的文字被認為是標簽中的子節(jié)點
                                             //節(jié)點的firstChild屬性為該節(jié)點下的第1個子節(jié)點
                                             //nodeValue屬性為節(jié)點的值,也就是標簽中的文本值
                                             node.firstChild.nodeValue = "更新后的數據";
                                   }
                         -->
                         </script>
               </head>
      </html>

注意:目前主流的瀏覽器都支持DOM技術的局部刷新。

7、完整的AJAX實例

       <html>
                <head>
                           <title>AJAX實例</title>
                           <script language="javascript" type="text/javascript">    
                           <!--

                                     var xmlHttpRequest;  //定義一個變量用于存放XMLHttpRequest對象
                                     //定義一個用于創(chuàng)建XMLHttpRequest對象的函數
                                     function createXMLHttpRequest()
                                    {
                                            if(window.ActiveXObject)
                                            {
                                                   //IE瀏覽器的創(chuàng)建方式
                                                   xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                                            }else if(windew.XMLHttpRequest)
                                           {
                                                  //Netscape瀏覽器中的創(chuàng)建方式
                                                  xmlHttpRequest = new XMLHttpRequest();
                                            }
                                   }
                                   //響應HTTP請求狀態(tài)變化的函數
                                   function httpStateChange()
                                   {
                                          //判斷異步調用是否完成
                                         if(xmlHttpRequest.readyState == 4)
                                        {
                                                //判斷異步調用是否成功,如果成功開始局部更新數據
                                                if(xmlHttpRequest.status == 200||xmlHttpRequest.status == 0)
                                                {
                                                       //查找節(jié)點
                                                       var node = document.getElementById("myDIv");

                                                        //更新數據

                                                        node.firstChild.nodeValue = xmlHttpRequest .responseText;
                                                }
                                                else
                                               {
                                                     //如果異步調用未成功,彈出警告框,并顯示出錯信息
                                                     alert("異步調用出錯/n返回的HTTP狀態(tài)碼為:"+xmlHttpRequest.status + "/n返回的HTTP狀態(tài)信息為:" + xmlHttpRequest.statusText);
                                               }
                                         }
                                     }
                                    //異步調用服務器段數據
                                   function getData(name,value)
                                  {                   
                                       //創(chuàng)建XMLHttpRequest對象
                                       createXMLHttpRequest();
                                       if(xmlHttpRequest!=null)
                                       {
                                            //創(chuàng)建HTTP請求
                                            xmlHttpRequest.open("get","ajax.text",true)
                                           //設置HTTP請求狀態(tài)變化的函數
                                            xmlHttpRequest.onreadystatechange = httpStateChange;
                                           //發(fā)送請求
                                          xmlHttpRequest.send(null);
                                        }
                                  }
                           -->
                          </script>
                </head>

                <body>
                         <div id="myDiv">原數據</div>
                         <input type = "button" value = "更新數據" onclick = "getData()">
                </body>
       </html>

以上是“如何實現AJAX異步調用和局部刷新”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI