Ajax工作原理

來源:互聯網
上載者:User

標籤:style   http   java   color   strong   資料   

一: ajax 的全稱是Asynchronous JavaScript and XML,其中,Asynchronous 是非同步意思,它有別於傳統web開發中採用的同步的方式。

二:關於同步和非同步

 非同步傳輸是面向字元的傳輸,它的單位是字元;而同步傳輸是面向位元的傳輸,它的單位是楨,它傳輸的時候要求接受方和發送方的時鐘是保持一致的。

具體來說,非同步傳輸是將位元分成小組來進行傳送。一般每個小組是一個8位字元,在每個小組的頭部和尾部都有一個開始位和一個停止位,它在傳送過程中接收方和發送方的時鐘不要求一致,也就是說,發送方可以在任何時刻發送這些小組,而接收方並不知道它什麼時候到達。一個最明顯的例子就是電腦鍵盤和主機的通訊,按下一個鍵的同時向主機發送一個8位元位的ASCII代 碼,鍵盤可以在任何時刻發送代碼,這取決於使用者的輸入速度,內部的硬體必須能夠在任何時刻接收一個鍵入的字元。這是一個典型的非同步傳輸過程。非同步傳輸存在 一個潛在的問題,即接收方並不知道資料會在什麼時候到達。在它檢測到資料並做出響應之前,第一個位元已經過去了。這就像有人出乎意料地從後面走上來跟你說 話,而你沒來得及反應過來,漏掉了最前面的幾個詞。因此,每次非同步傳輸的資訊都以一個起始位開頭,它通知接收方資料已經到達了,這就給了接收方響應、接收 和快取資料位元的時間;在傳輸結束時,一個停止位表示該次傳輸資訊的終止。按照慣例,空閑(沒有傳送資料)的線路實際攜帶著一個代表二進位1的訊號。步傳輸的開始位使訊號變成0,其他的位元位使訊號隨傳輸的資料資訊而變化。最後,停止位使訊號重新變回1,該訊號一直保持到下一個開始位到達。例如在鍵盤上數字“1”,按照8位元位的擴充ASCII編碼,將發送“00110001”,同時需要在8位元位的前面加一個起始位,後面一個停止位。

同步傳輸的位元分組要大得多。它不是獨立地發送每個字元,每個字元都有自己的開始位和停止位,而是把它們組合起來一起發送。我們將這些組合稱為資料幀,或簡稱為幀。

  資料幀的第一部分包含一組同步字元,它是一個獨特的位元組合,類似於前面提到的起始位,用於通知接收方一個幀已經到達,但它同時還能確保接收方的採樣速度和位元的到達速度保持一致,使收發雙方進入同步。

  幀的最後一部分是一個幀結束標記。與同步字元一樣,它也是一個獨特的位元串,類似於前面提到的停止位,用於表示在下一幀開始之前沒有別的即將到達的資料了。

  同步傳輸通常要比非同步傳輸快速得多。接收方不必對每個字元進行開始和停止的操作。一旦檢測到幀同步字元,它就在接下來的資料到達時接收它們。另外,同步傳輸的開銷也比較少。例如,一個典型的幀可能有500位元組(即4000位元)的資料,其中可能只包含100位元的開銷。這時,增加的位元位使傳輸的位元總數增加2.5%,這與非同步傳輸中25 %的增值要小得多。隨著資料幀中實際資料位元位的增加,開銷位元所佔的百分比將相應地減少。但是,資料位元位越長,快取資料所需要的緩衝區也越大,這就限制了一個幀的大小。另外,幀越大,它佔據傳輸媒體的連續時間也越長。在極端的情況下,這將導致其他使用者等得太久。

三:

ajax原理和XmlHttpRequest對象

  Ajax的原理簡單來說通過XmlHttpRequest對象來向伺服器發非同步請求,從伺服器獲得資料,然後用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從伺服器獲得請求資料。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所瞭解。

 XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支援非同步請求的技術。簡單的說,也就是javascript可以及時向伺服器提出請求和處理響應,而不阻塞使用者。達到無重新整理的效果。

   所以我們先從XMLHttpRequest講起,來看看它的工作原理。

   首先,我們先來看看XMLHttpRequest這個對象的屬性。

    它的屬性有:

    onreadystatechange  每次狀態改變所觸發事件的事件處理常式。

    responseText     從伺服器處理序返回資料的字串形式。

    responseXML    從伺服器處理序返回的DOM相容的文檔資料對象。

    status           從伺服器返回的數字代碼,比如常見的404(未找到)和200(已就緒)

    status Text       伴隨狀態代碼的字串資訊

    readyState       對象狀態值

    0 (未初始化) 對象已建立,但是尚未初始化(尚未調用open方法)

    1 (初始化) 對象已建立,尚未調用send方法

    2 (發送資料) send方法已調用,但是當前的狀態及http頭未知

    3 (資料傳送中) 已接收部分資料,因為響應及http頭不全,這時通過responseBody和responseText擷取部分資料會出現錯誤,

    4 (完成) 資料接收完畢,此時可以通過通過responseXml和responseText擷取完整的回應資料

註:由於各瀏覽器之間存在差異,所以建立一個XMLHttpRequest對象可能需要不同的方法。這個差異主要體現在IE和其它瀏覽器之間。下面是一個比較標準的建立XMLHttpRequest對象的方法。

    eg:

var xmlHttp;
//針對不同瀏覽器產生XMLHttpRequest對象的方法
function getXmlHttp(){  

//IE瀏覽器建立XmlHttpRequest對象

if(window.ActiveXObject){
        xmlHttp = new ActiveXObject("MICROSOFT.XMLHTTP");
    }

//非IE瀏覽器建立XmlHttpRequest對象

else if(window.XMLHttpRequest){
        xmlHttp = new XMLHttpRequest();
    }
}

 

function sendParam(obj){

 if (!xmlhttp) {
alert("建立xmlhttp對象異常!");
return false;
}

    getXmlHttp();   

  xmlHttp.open("GET","check.php?user="+obj,true);    

xmlHttp.onreadystatechange = getTxt;  

   xmlHttp.send(null);

}

 

function getTxt(){  

     if(xmlHttp.readyState == 4){     

            if(xmlHttp.status == 200){     

                var sp = document.getElementById("warning");      

                var flag = xmlHttp.responseText;

     if(flag == "1"){                

               sp.innerHTML = "該使用者已經被註冊,請輸入其他使用者名稱";                

               sp.style.cssText = "color:red;font-size:14px";            

                          }else{               

                sp.innerHTML = "可以註冊";               

                 sp.style.cssText = "color:green;font-size:14px";             }

                               }   

                  }

     }

 

 

 

 

 

如上所示,函數首先檢查XMLHttpRequest的整體狀態並且保證它已經完成(readyStatus=4),即資料已經發送完畢。然後根據伺服器的設定詢問請求狀態,如果一切已經就緒(status=200),那麼就執行下面需要的操作。

對於XmlHttpRequest的兩個方法,open和send,其中open方法指定了:

a、向伺服器提交資料的類型,即post還是get。

b、請求的url地址和傳遞的參數。

      c、傳輸方式,false為同步,true為非同步。預設為true。如果是非同步通訊方式(true),客戶機就不等待伺服器的響應;如果是同步方式(false),客戶機就要等到伺服器返回訊息後才去執行其他動作。我們需要根據實際需要來指定同步方式,在某些頁面中,可能會發出多個請求,甚至是有組織有計劃有隊形大規模的高強度的request,而後一個是會覆蓋前一個的,這個時候當然要指定同步方式。

    Send方法用來發送請求。

 

  知道了XMLHttpRequest的工作流程,我們可以看出,XMLHttpRequest是完全用來向伺服器發出一個請求的,它的作用也局限於此,但它的作用是整個ajax實現的關鍵,因為ajax無非是兩個過程,發出請求和響應請求。並且它完全是一種用戶端的技術。而XMLHttpRequest正是處理了伺服器端和用戶端通訊的問題所以才會如此的重要。

  現在,我們對ajax的原理大概可以有一個瞭解了。我們可以把伺服器端看成一個資料介面,它返回的是一個純文字流,當然,這個文字資料流可以是XML格式,可以是Html,可以是Javascript代碼,也可以只是一個字串。這時候,XMLHttpRequest向伺服器端請求這個頁面,伺服器端將文本的結果寫入頁面,這和普通的web開發流程是一樣的,不同的是,用戶端在非同步擷取這個結果後,不是直接顯示在頁面,而是先由javascript來處理,然後再顯示在頁面。至於現在流行的很多ajax控制項,比如magicajax等,可以返回DataSet等其它資料類型,只是將這個過程封裝了的結果,本質上他們並沒有什麼太大的區別。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.