Ajax之旅(三)-- 非同步更新

來源:互聯網
上載者:User

標籤:style   blog   http   color   java   使用   os   io   

       上篇博文中,已經為大家在理論上講述了什麼是XMLHttpRequest對象,它是Ajax實現非同步更新的核心對象。下面,我們就通過一個執行個體,來瞭解XMLHTTPRequest對象的使用或者說非同步更新的實現


       執行個體:判斷使用者代碼是否重複

             

       

       方案一:同步更新。原理如所示:

                   

       從中可以看到,當我們在瀏覽器使用者代碼輸入框中輸入“使用者代碼”後,只能等待伺服器的響應,當伺服器將結果反饋給瀏覽器後,我們才可以進行下一個操作,也就是繼續輸入“使用者名稱稱”。

       這就是同步更新,這樣必然會給使用者帶來幾秒鐘的等待時間,也許一個輸入框顯不出什麼,如果每次輸入焦點東西,就要等待幾秒,哪怕一秒,還會有使用者願意繼續使用我們的網站嗎?所以,非同步跟新出來了。


       方案二:非同步更新,原理如所示:

                                            

       從可以看出和同步更新的明顯不同。在非同步更新中,我們使用了Ajax引擎,看起來,也就好像是,在瀏覽器和伺服器中間加入了中介層(Ajax引擎)

       這樣,當我們輸入完“使用者代碼”後,瀏覽器將請求發送給Ajax引擎,然後就可以繼續輸入“使用者名稱稱”了,不再需要等待。而Ajax引擎則再將請求發送給伺服器。當伺服器操作完成後,將結果返回給Ajax引擎,Ajax引擎再返回給瀏覽器,進而顯示。簡言之,瀏覽器只需要把請求發送給Ajax即可,然後該幹什麼還幹什麼;當Ajax引擎有更新時,利用回呼函數返回給瀏覽器。這就是非同步更新。


       通過方案一,我們也很明顯的知道了方案二的優勢,那麼究竟在代碼中如何?呢,下面是我針對上述執行個體---判斷使用者代碼是否重複 的一些代碼實現,僅供大家參考。當然,也利用這些實現,來讓讀者朋友們,對XMLHttpRequest對象的使用,有所深入瞭解。


       第一步:建立Ajax核心對象XMLHttpRequest。

       這裡,我們需要針對不同的瀏覽器做不同的執行個體化結果。

<span style="font-size:18px;"> var xmlHttp;     function createXMLHttpRequest(){         //表示當前瀏覽器不是ie         if(window.XMLHttpRequest){              xmlHttp= newXMLHttpRequest();         } else if (window.ActiveXObject){              xmlHttp= newActiveXObject("Microsoft.XMLHTTP");         }     }</span>

       

       第二步:註冊回呼函數。

       回呼函數,是XMLHttpRequest對象實現非同步更新的核心方法。發送一個請求後,用戶端無法確定什麼時候會完成這個請求,所以需要用事件機制來捕獲請求的狀態,XMLHttpRequest對象提供了onreadyStateChange事件實現這一功能,也就是我們常說的回呼函數。

       再通俗一點說:回調,不是你主動調的,是由伺服器來調的(在這裡是Ajax引擎調的。)

<span style="font-size:18px;"><span style="font-size:14px;">//註冊回呼函數xmlHttp.onreadystatechange= callback;</span></span>

       此處,需要注意一點:

<span style="font-size:18px;">xmlHttp.onreadystatechange = callback(); //代表方法調用xmlHttp.onreadystatechange = callback;   //代表把方法的地址傳過去</span>

    

       第三步:設定和伺服器端的互動方式及相應參數。

       就是我們常說的是get提交還是post提交,根據不同的提交方式,代碼實現也不盡相同,下面給出的實現是get提交的代碼。此處還有一個參數,xmlHttp.open("GET", url, true)中,true代表是非同步提交,false則代表同步提交,所以,想要實現非同步更新,此處參數還需設定為true

<span style="font-size:18px;">        //第三步:設定和伺服器端的互動方式及相應參數        varurl= "user_validate.jsp?userId=" + trim(filed.value)+"&time=" + new Date().getTime()             </span>
<span style="font-size:18px;">        xmlHttp.open("GET", url, true);</span>

    

       第四步:向伺服器端發送資料。

       上述設定均完成後,我們只需要向伺服器端發送資料即可。

<span style="font-size:18px;">         //第四步:向伺服器端發送資料         xmlHttp.send(null);         } else {              document.getElementById("spanUserId").innerHTML = "";         }     </span>

            

        第五步:利用callback函數,來判斷與伺服器端的互動是否完成,響應是否正確,並根據需要伺服器端返回的資料,更新頁面內容。

<span style="font-size:18px;">//第五步:判斷與伺服器端的互動是否完成     functioncallback(){         if (xmlHttp.readyState== 4) {              if (xmlHttp.status ==200) {                   if (trim(xmlHttp.responseText)!= "") {                       //alert(xmlHttp.responseText);                       document.getElementById("spanUserId").innerHTML = "<fontcolor='red'>"                                + xmlHttp.responseText + "</font>"                   }else{                       document.getElementById("spanUserId").innerHTML = "";                   }              } else {                   alert("請求失敗。錯誤碼為:" + xmlHttp.status);              }         }     }</span>

       這裡需要注意:

<span style="font-size:18px;">ajax.readyState== 4  //只要有響應就返回。不管正確與否; Ajax引擎狀態為成功ajax.status ==200 //HTTP協議狀態為成功</span>

       

       五步下來,我們判斷使用者代碼是否重複的非同步更新也就實現啦,不知道你對Ajax,對XMLHttpRequest對象,對非同步更新又瞭解了多少了?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.