.net ajax 的原理

關於ajax的名字

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

4、關於同步和異步


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

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

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

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

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

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


瞭解了同步和異步的概念之後,大家應該對ajax爲什麼可以提升用戶體驗應該比較清晰了,它是利用異步請求方式的。打個比方,如果現在你家裏所在的小區因 某種情況而面臨停水,現在有關部門公佈了兩種方案,一是完全停水8個小時,在這8個小時內完全停水,8個小時後恢復正常。二是不完全停水10 個小時,在這10個小時內水沒有完全斷,只是流量比原來小了很多,在10個小時後恢復正常流量,那麼,如果是你你會選擇哪種方式呢?顯然是後者。

5、ajax所包含的技術

大家都知道ajax並非一種新的技術,而是幾種原有技術的結合體。它由下列技術組合而成。

1.使用CSS和XHTML來表示。

2. 使用DOM模型來交互和動態顯示。

3.使用XMLHttpRequest來和服務器進行異步通信。

2.使用javascript來綁定和調用。

在上面幾中技術中,除了XmlHttpRequest對象以外,其它所有的技術都是基於web標準並且已經得到了廣泛使用的,XMLHttpRequest雖然目前還沒有被W3C所採納,但是它已經是一個事實的標準,因爲目前幾乎所有的主流瀏覽器都支持它。


6、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對象的方法。


function CreateXmlHttp()

{



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

if(window.XmlHttpRequest)

{

xmlhttp=new XmlHttpRequest();

}

//IE瀏覽器創建XmlHttpRequest對象

if(window.ActiveXObject)

{

try

{

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

catch(e)

{

try{

xmlhttp=new ActiveXObject("msxml2.XMLHTTP");

}

catch(ex){}

}

}

}

function Ustbwuyi()

{

var data=document.getElementById("username").value;

CreateXmlHttp();

if(!xmlhttp)

{

alert("創建xmlhttp對象異常!");

return false;

}

xmlhttp.open("POST",url,false);

xmlhttp.onreadystatechange=function()

{

if(xmlhttp.readyState==4)

{

document.getElementById("user1").innerHTML="數據正在加載...";

if(xmlhttp.status==200)

{

document.write(xmlhttp.responseText);

}

}

}

xmlhttp.send();



}

如上所示,函數首先檢查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等其它數據類型,只是將這個過程封裝了的結果,本質上他們並沒有什麼太大的區別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章