1. 程式人生 > >原生JS實現AJAX的思路

原生JS實現AJAX的思路

           AJAX在網站的資料互動中起著重要的作用,它在不用重新整理整個網頁的情況下,能對網頁的區域性內容進行更新。當然它並不是一種新的程式語言,而是一種使用現有標準的方法。

      我們知道,在傳統的網頁資料互動中,都是遵循這樣一個流程:首先是客戶端向伺服器傳送請求,伺服器收到相應請求後,將所有頁面內容的資料一起返回到客戶端,也就是整個html文件。這樣做一個很明顯的缺點是當頁面中的某個位置需要更新時,資料整體提交,整個html文件都會載入,這樣就會浪費網路頻寬,還有就是使用者體驗不好,同時它一個響應對應一個請求,如無響應,不能再繼續。

       AJAX就可以解決以上傳統網頁資料互動中所存在的問題。以內容主要介紹一下如何用原生JS實現AJAX的基本思路。

      在這之前,首先要知道的是在AJAX機制下,客戶端和伺服器之間的資料互動是以AJAX引擎為中介進行的。客戶端可以用GET和POST兩種方式和伺服器完成資料互動,其中兩者都可以用於傳輸資料,但GET主要用於從伺服器獲取資料,相對來說它的安全性較POST方式低,加為所傳送的資料都是通過URL來傳輸的,同時傳輸的資料量較少。而POST主要用於傳送資料,安全性相對較高,同時輸送的資料量較大。

      客戶端要和伺服器進行資料互動時,大致的流程是:首先發送一個連線請求,建立連線,然後進行資料請求,等待伺服器返回的響應,最後對收到的資料進行解析處理。

       傳送一個連線請求,建立連線程式碼如下:

          var xhr;       //建立XMLHttpRequest或ActiveXObject物件

         if(window.XMLHttpRequest){

                xhr=new XMLHttpRequest();

         }

         else{

               xhr=new ActiveXObject("Microsoft.XMLHTTP");    //相容低版本IE

          }

         xhr.open(method,url,true);//method:傳輸資料的方式,url:資源地址,第三個引數通常為true表示非同步模式

        xhr.open(method,url,true);//建立連線

      資料請求:

         if(method=='GET'){//當使用GET方法時send()函式的引數可不寫或置null


xhr.send(null);
}
else{     //POST方法需設一個要傳輸的資料
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(data);
}

       對收到的資料進行解析處理(程式碼如下):

        xhr.onreadystatechange=function(){
if(xhr.readyState==4){

                       /*readyState分4種狀態。

                      0表示未初始化)還沒有呼叫open()方法

                      1表示載入)已呼叫send()方法,正在傳送請求     

                      2表示載入完成)send()方法完成,已收到全部響應內容                 

                      3表示解析)正在解析響應內容

                   4表示完成)響應內容解析完成,可以在客戶端呼叫了

                       */
if(xhr.status==200){   //200表示確定。客戶端請求已成功。 
funsucc&&funsucc(xhr.responseText);
}
else{
alert(" 出錯了,狀態碼為"+xhr.status);
}
}
}

        收到的內容對於以XML方式組成的則呼叫xhr.responseXML,這在老版本的網站中可能會乃至。而對於以字串,JSON,html儲存的資料,則應以xhr.responseText的方式來獲取。

      封裝後的程式碼如下:

    function ajax(method,url,data,funsucc){  //method:資料傳輸的方式,url:資料地址,data要傳送的資料,
var xhr;                                                //funsucc:回撥函式,用於在客戶端對返回的資料進行處理
if(window.XMLHttpRequest){
xhr=new XMLHttpRequest();
}
else{
xhr=new ActiveXObject('Microsoft.XMLHTTP');
}
if(method=='GET'&&data){
url+='?'+data;
}
xhr.open(method,url,true);
if(method=='GET'){
xhr.send(null);
}
else{
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(data);
}
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
if(xhr.status==200){
funsucc&&funsucc(xhr.responseText);
}
else{
alert(" 出錯了,狀態碼為"+xhr.status);
}
}
}
}