1. 程式人生 > >Ajax技術---核心XMLHttpRequest物件

Ajax技術---核心XMLHttpRequest物件

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

(一)ajax技術的意義

我們在平時的開發中都多多少少的接觸或者應用到了ajax,談到ajax技術的意義,我們關注得最多的毫無疑問是提升使用者的體驗。但是,如果我們結合將來電腦和網際網路的發展趨勢,我們會發現ajax技術在某些方面正好代表了這種趨勢。為什麼這樣說呢?我們知道,自從電腦出現以來,一直是桌面軟體佔據著絕對主導的地位,但是網際網路的出現和成功使這一切開始發生著微妙的變化。相當一部分的人都相信,遲早有一天,資料和電腦軟體將會從桌面轉移到網際網路。也就是說,將來的電腦有可能拋棄笨重的硬碟,而直接從網際網路來獲取資料和服務,我記得我念大學的時候,有位教授給我們上課的時候,曾經設想過這樣一種情景,也許在將來的電腦桌面上,沒有任何多餘的軟體和程式,而僅僅只有一個IE,雖然現在看起來我們距離這一天還很遙遠,並且這其中還有很多的問題需要解決,但是我覺得這個並非夢想,而是遲早將實現的現實。那麼,這其中的主要問題就是網際網路的連線不穩定,誰也不願意看著自己的電腦從伺服器一點一滴的下載資料,那麼,ajax是不是解決了這個問題呢,說實話,與其說ajax解決了這個問題,

人山人海英文倒不如它只是掩蓋了這個問題,它只是在伺服器和客戶端之間充當了一個緩衝器,讓使用者誤以為服務沒有中斷。精確的說,ajax並不能提高從伺服器端下載資料的速度,而只是使這個等待不那麼令人沮喪。但是正是這一點就足以產生巨大的影響和震動,它實際上也對桌面軟體產生了巨大的衝擊。這一點我用一個例子來說明,我們可以比較一下Outlook Express和Gmail,前者是典型的桌面軟體,後者是ajax所實現的B/S模式,實際上後者目前已經在慢慢取代前者了,Gmail在收發郵件的時候已經和Outlook Express的功能幾乎沒有差別了,而且它不需要安裝客戶端程式。這就是為什麼微軟對ajax所帶來的衝擊有著如此的恐懼心理,並且在它前不久所進行的調查之中,將google看做他們未來十年內的主要競爭對手的主要原因之一。當然,這種變化也並不會將桌面軟體全部淘汰,現有的瀏覽器還沒有一個能像PhotoShop等桌面程式那樣處理複雜的影象。但是我們也不能忽視它帶來的影響和衝擊。

(二)傳統開發模式與Ajax開發模式對比

在傳統的Web應用模式中,頁面使用者的每一次操作都將會觸發一次返回Web伺服器的HTTP請求,伺服器進行相應的處理(獲得資料、執行與不同的系統會話)後,返回一個HTML頁面給客戶端,如圖所示:

這裡寫圖片描述

而在Ajax應用中,頁面中使用者操作將通過Ajax引擎與伺服器端進行通訊,然後將返回結果提交給客戶端的Ajax引擎,再由Ajax引擎來決定將這些資料插入到頁面的指定位置(背後實際是通過XMLHttpRequest物件實現的),如圖:

這裡寫圖片描述

區別:對於每個使用者的行為,在傳統的Web應用模式中,將生成一次HTTP請求,而在Ajax應用開發模式中,將變成對Ajax引擎的一次JavaScript呼叫。在Ajax應用開發模式中通過JavaScript實現在不重新整理整個頁面的情況下,對部分資料進行更新,從而降低了網路流量,給使用者帶來更好的體驗。

(三)關於同步和非同步

非同步傳輸是面向字元的傳輸,它的單位是字元;而同步傳輸是面向位元的傳輸,它的單位是楨,它傳輸的時候要求接受方和傳送方的時鐘是保持一致的。
具體來說,非同步傳輸是將位元分成小組來進行傳送。一般每個小組是一個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所包含的技術

大家都知道ajax並非一種新的技術,而是幾種原有技術的結合體。它由下列技術組合而成。
1.使用CSS和XHTML來表示。
2. 使用DOM模型來互動和動態顯示(DOM是文件物件模型的簡稱,是表示文件和訪問、操作構成文件的各種元素的應用程式介面。W3C定義了標準的文件物件模型,它以樹形結構表示HTML和XML文件,並且定義了遍歷樹和新增、修改、查詢樹的節點的方法和屬性。在Ajax中通過JavaScript操作DOM,可以達到在不重新整理頁面的情況下實時修改使用者介面的目的)。
3.使用XMLHttpRequest來和伺服器進行非同步通訊。
4.使用javascript來繫結和呼叫。
在上面幾中技術中,除了XmlHttpRequest物件以外,其它所有的技術都是基於web標準並且已經得到了廣泛使用的,XMLHttpRequest雖然目前還沒有被W3C所採納,但是它已經是一個事實的標準,因為目前幾乎所有的主流瀏覽器都支援它。

(五)Ajax原理和XmlHttpRequest物件

  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的原則是“按需取資料”,可以最大程度的減少冗餘請求,和響應對伺服器造成的負擔。
  • 基於標準化的並被廣泛支援的技術,不需要下載外掛或者小程式

缺點

  • ajax幹掉了back按鈕,即對瀏覽器後退機制的破壞。後退按鈕是一個標準的web站點的重要功能,但是它沒法和js進行很好的合作。這是ajax所帶來的一個比較嚴重的問題,因為使用者往往是希望能夠通過後退來取消前一次操作的。那麼對於這個問題有沒有辦法?答案是肯定的,用過Gmail的知道,Gmail下面採用的ajax技術解決了這個問題,在Gmail下面是可以後退的,但是,它也並不能改變ajax的機制,它只是採用的一個比較笨但是有效的辦法,即使用者單擊後退按鈕訪問歷史記錄時,通過建立或使用一個隱藏的IFRAME來重現頁面上的變更。(例如,當用戶在Google Maps中單擊後退時,它在一個隱藏的IFRAME中進行搜尋,然後將搜尋結果反映到Ajax元素上,以便將應用程式狀態恢復到當時的狀態。)但是,雖然說這個問題是可以解決的,但是它所帶來的開發成本是非常高的,和ajax框架所要求的快速開發是相背離的。這是ajax所帶來的一個非常嚴重的問題。
  • 安全問題
    技術同時也對IT企業帶來了新的安全威脅,ajax技術就如同對企業資料建立了一個直接通道。這使得開發者在不經意間會暴露比以前更多的資料和伺服器邏輯。ajax的邏輯可以對客戶端的安全掃描技術隱藏起來,允許黑客從遠端伺服器上建立新的攻擊。還有ajax也難以避免一些已知的安全弱點,諸如跨站點腳步攻擊、SQL注入攻擊和基於credentials的安全漏洞等
  • 對搜尋引擎的支援比較弱
  • 破壞了程式的異常機制。至少從目前看來,像ajax.dll,ajaxpro.dll這些ajax框架是會破壞程式的異常機制的(這個是看到的,目前我個人還沒有實際理解和遇到)
  • 違背了url和資源定位的初衷。例如,我給你一個url地址,如果採用了ajax技術,也許你在該url地址下面看到的和我在這個url地址下看到的內容是不同的。這個和資源定位的初衷是相背離的
  • 一些手持裝置(如手機、PDA等)現在還不能很好的支援ajax,比如說我們在手機的瀏覽器上打開採用ajax技術的網站時,它目前是不支援的

(七)Ajax常用框架

目前我們採用的比較多的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,當然這是微軟的一個競爭策略。

此文也要感謝此連結,從其中也學習到了很多