Ajax 的全稱是Asynchronous JavaScript and XML,其中,Asynchronous 是異步的意思,它有別於傳統web開發中採用的同步的方式。javascript
咱們在平時的開發中都多多少少的接觸或者應用到了ajax,談到ajax技術的意義,咱們關注得最多的毫無疑問是提高用戶的體驗。可是,若是咱們結合未來電腦和互聯網的發展趨勢,咱們會發現ajax技術在某些方面正好表明了這種趨勢。爲何這樣說呢?咱們知道,自從電腦出現以來,一直是桌面軟件佔據着絕對主導的地位,可是互聯網的出現和成功使這一切開始發生着微妙的變化。至關一部分的人都相信,早晚有一天,數據和電腦軟件將會從桌面轉移到互聯網。也就是說,未來的電腦有可能拋棄笨重的硬盤,而直接從互聯網來獲取數據和服務,我記得我念大學的時候,有位教授給咱們上課的時候,曾經設想過這樣一種情景,也許在未來的電腦桌面上,沒有任何多餘的軟件和程序,而僅僅只有一個IE,雖然如今看起來咱們距離這一天還很遙遠,而且這其中還有不少的問題須要解決,可是我以爲這個並不是夢想,而是早晚將實現的現實。那麼,這其中的主要問題就是互聯網的鏈接不穩定,誰也不肯意看着本身的電腦從服務器一點一滴的下載數據,那麼,ajax是否是解決了這個問題呢,說實話,與其說ajax解決了這個問題,人山人海英文倒不如它只是掩蓋了這個問題,它只是在服務器和客戶端之間充當了一個緩衝器,讓用戶誤覺得服務沒有中斷。精確的說,ajax並不能提升從服務器端下載數據的速度,而只是使這個等待不那麼使人沮喪。可是正是這一點就足以產生巨大的影響和震動,它實際上也對桌面軟件產生了巨大的衝擊。這一點我用一個例子來講明,咱們能夠比較一下Outlook Express和Gmail,前者是典型的桌面軟件,後者是ajax所實現的B/S模式,實際上後者目前已經在慢慢取代前者了,Gmail在收發郵件的時候已經和Outlook Express的功能幾乎沒有差異了,並且它不須要安裝客戶端程序。這就是爲何微軟對ajax所帶來的衝擊有着如此的恐懼心理,而且在它前不久所進行的調查之中,將google看作他們將來十年內的主要競爭對手的主要緣由之一。固然,這種變化也並不會將桌面軟件所有淘汰,現有的瀏覽器尚未一個能像PhotoShop等桌面程序那樣處理複雜的圖像。可是咱們也不能忽視它帶來的影響和衝擊。html
在傳統的Web應用模式中,頁面用戶的每一次操做都將會觸發一次返回Web服務器的HTTP請求,服務器進行相應的處理(得到數據、運行與不一樣的系統會話)後,返回一個HTML頁面給客戶端,如圖所示:java
而在Ajax應用中,頁面中用戶操做將經過Ajax引擎與服務器端進行通訊,而後將返回結果提交給客戶端的Ajax引擎,再由Ajax引擎來決定將這些數據插入到頁面的指定位置(背後實際是經過XMLHttpRequest對象實現的),如圖:web
區別:對於每一個用戶的行爲,在傳統的Web應用模式中,將生成一次HTTP請求,而在Ajax應用開發模式中,將變成對Ajax引擎的一次JavaScript調用。在Ajax應用開發模式中經過JavaScript實如今不刷新整個頁面的狀況下,對部分數據進行更新,從而下降了網絡流量,給用戶帶來更好的體驗。ajax
異步傳輸是面向字符的傳輸,它的單位是字符;而同步傳輸是面向比特的傳輸,它的單位是楨,它傳輸的時候要求接受方和發送方的時鐘是保持一致的。
具體來講,異步傳輸是將比特分紅小組來進行傳送。通常每一個小組是一個8位 字符,在每一個小組的頭部和尾部都有一個開始位和一箇中止位,它在傳送過程當中接收方和發送方的時鐘不要求一致,也就是說,發送方能夠在任什麼時候刻發送這些小組,而接收方並不知道它何時到達。一個最明顯的例子就是計算機鍵盤和主機的通訊,按下一個鍵的同時向主機發送一個8比特位的ASCII代 碼,鍵盤能夠在任什麼時候刻發送代碼,這取決於用戶的輸入速度,內部的硬件必須可以在任什麼時候刻接收一個鍵入的字符。這是一個典型的異步傳輸過程。異步傳輸存在 一個潛在的問題,即接收方並不知道數據會在何時到達。在它檢測到數據並作出響應以前,第一個比特已通過去了。這就像有人出乎意料地從後面走上來跟你說 話,而你沒來得及反應過來,漏掉了最前面的幾個詞。所以,每次異步傳輸的信息都以一個起始位開頭,它通知接收方數據已經到達了,這就給了接收方響應、接收 和緩存數據比特的時間;在傳輸結束時,一箇中止位表示該次傳輸信息的終止。按照慣例,空閒(沒有傳送數據)的線路實際攜帶着一個表明二進制1的信號。異步傳輸的開始位使信號變成0,其餘的比特位使信號隨傳輸的數據信息而變化。最後,中止位使信號從新變回1,該信號一直保持到下一個開始位到達。例如在鍵盤上數字「1」,按照8比特位的擴展ASCII編碼,將發送「00110001」,同時須要在8比特位的前面加一個起始位,後面一箇中止位。
同步傳輸的比特分組要大得多。它不是獨立地發送每一個字符,每一個字符都有本身的開始位和中止位,少兒英語教學法而是把它們組合起來一塊兒發送。咱們將這些組合稱爲數據幀,或簡稱爲幀。
數據幀的第一部分包含一組同步字符,它是一個獨特的比特組合,相似於前面提到的起始位,用於通知接收方一個幀已經到達,但它同時還能確保接收方的採樣速度和比特的到達速度保持一致,使收發雙方進入同步。
幀的最後一部分是一個幀結束標記。與同步字符同樣,它也是一個獨特的比特串,相似於前面提到的中止位,用於表示在下一幀開始以前沒有別的即將到達的數據了。
同步傳輸一般要比異步傳輸快速得多。接收方沒必要對每一個字符進行開始和中止的操做。一旦檢測到幀同步字符,它就在接下來的數據到達時接收它們。另外,同步傳輸的開銷也比較少。例如,一個典型的幀可能有500字節(即4000比特)的數據,其中可能只包含100比特的開銷。這時,增長的比特位使傳輸的比特總數增長2.5%,這與異步傳輸中25 %的增值要小得多。隨着數據幀中實際數據比特位的增長,開銷比特所佔的百分比將相應地減小。可是,數據比特位越長,緩存數據所須要的緩衝區也越大,這就限制了一個幀的大小。另外,幀越大,它佔據傳輸媒體的連續時間也越長。在極端的狀況下,這將致使其餘用戶等得過久。
瞭解了同步和異步的概念以後,你們應該對ajax爲何能夠提高用戶體驗應該比較清晰了,它是利用異步請求方式的。打個比方,若是如今你家裏所在的小區因 某種狀況而面臨停水,如今有關部門公佈了兩種方案,一是徹底停水8個小時,在這8個小時內徹底停水,8個小時後恢復正常。二是不徹底停水10 個小時,在這10個小時內水沒有徹底斷,只是流量比原來小了不少,在10個小時後恢復正常流量,那麼,若是是你你會選擇哪一種方式呢?顯然是後者。小程序
你們都知道ajax並不是一種新的技術,而是幾種原有技術的結合體。它由下列技術組合而成。
1.使用CSS和XHTML來表示。
2. 使用DOM模型來交互和動態顯示(DOM是文檔對象模型的簡稱,是表示文檔和訪問、操做構成文檔的各類元素的應用程序接口。W3C定義了標準的文檔對象模型,它以樹形結構表示HTML和XML文檔,而且定義了遍歷樹和添加、修改、查找樹的節點的方法和屬性。在Ajax中經過JavaScript操做DOM,能夠達到在不刷新頁面的狀況下實時修改用戶界面的目的)。
3.使用XMLHttpRequest來和服務器進行異步通訊。
4.使用javascript來綁定和調用。
在上面幾中技術中,除了XmlHttpRequest對象之外,其它全部的技術都是基於web標準而且已經獲得了普遍使用的,XMLHttpRequest雖然目前尚未被W3C所採納,可是它已是一個事實的標準,由於目前幾乎全部的主流瀏覽器都支持它。瀏覽器
Ajax的原理簡單來講經過XmlHttpRequest對象來向服務器發異步請求,從服務器得到數據,而後用javascript來操做DOM而更新頁面。這其中最關鍵的一步就是從服務器得到請求數據。雅思考試內容要清楚這個過程和原理,咱們必須對 XMLHttpRequest有所瞭解。
XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript能夠及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。緩存
(1)初始化XMLHttpRequest對象
在使用XMLHttpRequest對象發送請求和處理響應以前,首先須要初始化該對象,因爲XMLHttpRequest不是一個W3C標準,因此對於不一樣的瀏覽器,初始化的方法是不一樣的。一般狀況下,XMLHttpRequest對象只需考慮兩種狀況,一種是IE瀏覽器,另外一種是非IE瀏覽器:
IE瀏覽器(把XMLHttpRequest實例化爲一個ActiveX對象)安全
或者服務器
其中Msxml2.XMLHTTP和Microsoft.XMLHTTP是針對IE瀏覽器的不一樣版本進行設置的,目前比較經常使用的是這兩種。
非IE瀏覽器
把XMLHttpRequest對象實例化爲一個本地JavaScript對象:
爲了提升程序的兼容性能夠建立一個跨瀏覽器的XMLHttpRequest對象:
(2)XMLHttpRequest對象的經常使用方法
(3)XMLHttpRequest對象的經常使用屬性
實例
如上所示,函數首先檢查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代碼,boat怎麼讀也能夠只是一個字符串。這時候,XMLHttpRequest向服務器端請求這個頁面,服務器端將文本的結果寫入頁面,這和普通的web開發流程是同樣的,不一樣的是,客戶端在異步獲取這個結果後,不是直接顯示在頁面,而是先由javascript來處理,而後再顯示在頁面。至於如今流行的不少Ajax控件,好比magicajax等,能夠返回DataSet等其它數據類型,只是將這個過程封裝了的結果,本質上他們並無什麼太大的區別。
優勢:
缺點
目前咱們採用的比較多的ajax框架主要有ajax.dll,ajaxpro.dll,magicajax.dll 以及微軟的atlas框架。Ajax.dll和Ajaxpro.dll這兩個框架差異不大,而magicajax.dll只是封裝得更厲害一些,好比說它能夠直接返回DataSet數據集,前面咱們已經說過,ajax返回的都是字符串,magicajax只是對它進行了封裝而已。可是它的這個特色能夠給咱們帶來很大的方便,好比說咱們的頁面有一個列表,而列表的數據是不斷變化的,那麼咱們能夠採用magicajax來處理,操做很簡單,添加magicajax以後,將要更新的列表控件放在magicajax的控件以內,而後在pageload裏面定義更新間隔的時間就ok了,atlas的原理和magicajax差很少。可是,須要注意的一個問題是,這幾種框架都只支持IE,沒有進行瀏覽器兼容方面的處理,用反編譯工具察看他們的代碼就能夠知道。
除了這幾種框架以外,咱們平時用到的比較多的方式是本身建立xmlHttpRequest對象,這種方式和前面的幾種框架相比更具備靈活性。另外,在這裏還提一下aspnet2.0自帶的異步回調接口,它和ajax同樣也能夠實現局部的無刷新,但它的實現實際上也是基於xmlhttprequest對象的,另外也是隻支持IE,固然這是微軟的一個競爭策略。
此文也要感謝此連接,從其中也學習到了不少