一: ajax 的全稱是Asynchronous JavaScript and XML,其中,Asynchronous 是異步的意思,它有別於傳統web開發中採用的同步的方式。javascript
二:關於同步和異步php
異步傳輸是面向字符的傳輸,它的單位是字符;而同步傳輸是面向比特的傳輸,它的單位是楨,它傳輸的時候要求接受方和發送方的時鐘是保持一致的。css
具體來講,異步傳輸是將比特分紅小組來進行傳送。通常每一個小組是一個8位字符,在每一個小組的頭部和尾部都有一個開始位和一箇中止位,它在傳送過程當中接收方和發送方的時鐘不要求一致,也就是說,發送方能夠在任什麼時候刻發送這些小組,而接收方並不知道它何時到達。一個最明顯的例子就是計算機鍵盤和主機的通訊,按下一個鍵的同時向主機發送一個8比特位的ASCII代 碼,鍵盤能夠在任什麼時候刻發送代碼,這取決於用戶的輸入速度,內部的硬件必須可以在任什麼時候刻接收一個鍵入的字符。這是一個典型的異步傳輸過程。異步傳輸存在 一個潛在的問題,即接收方並不知道數據會在何時到達。在它檢測到數據並作出響應以前,第一個比特已通過去了。這就像有人出乎意料地從後面走上來跟你說 話,而你沒來得及反應過來,漏掉了最前面的幾個詞。所以,每次異步傳輸的信息都以一個起始位開頭,它通知接收方數據已經到達了,這就給了接收方響應、接收 和緩存數據比特的時間;在傳輸結束時,一箇中止位表示該次傳輸信息的終止。按照慣例,空閒(沒有傳送數據)的線路實際攜帶着一個表明二進制1的信號。步傳輸的開始位使信號變成0,其餘的比特位使信號隨傳輸的數據信息而變化。最後,中止位使信號從新變回1,該信號一直保持到下一個開始位到達。例如在鍵盤上數字「1」,按照8比特位的擴展ASCII編碼,將發送「00110001」,同時須要在8比特位的前面加一個起始位,後面一箇中止位。java
同步傳輸的比特分組要大得多。它不是獨立地發送每一個字符,每一個字符都有本身的開始位和中止位,而是把它們組合起來一塊兒發送。咱們將這些組合稱爲數據幀,或簡稱爲幀。web
數據幀的第一部分包含一組同步字符,它是一個獨特的比特組合,相似於前面提到的起始位,用於通知接收方一個幀已經到達,但它同時還能確保接收方的採樣速度和比特的到達速度保持一致,使收發雙方進入同步。ajax
幀的最後一部分是一個幀結束標記。與同步字符同樣,它也是一個獨特的比特串,相似於前面提到的中止位,用於表示在下一幀開始以前沒有別的即將到達的數據了。瀏覽器
同步傳輸一般要比異步傳輸快速得多。接收方沒必要對每一個字符進行開始和中止的操做。一旦檢測到幀同步字符,它就在接下來的數據到達時接收它們。另外,同步傳輸的開銷也比較少。例如,一個典型的幀可能有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等其它數據類型,只是將這個過程封裝了的結果,本質上他們並無什麼太大的區別。