隨着Web技術的發展,RIA似乎已經成了主流,Ajax也隨之成了不可或缺的部分。Ajax是異步的javascript和Xml,雖然現在很多交互的數據格式都不再嚴格的采用XML,但這種異步的操作卻越來越流行了。目前主流的JS工具包都包含了Ajax的功能,dojo也有自己的Ajax框架XHR。
XHR框架
XHR框架是dojo對ajax支持的一組方法,允許想服務器端發出get、post、put、delete請求,這些方法包括:
- xhrGet
- xhrPost
- xhrPut
- xhrDelete
所有這些函數都遵守相同的語法:接受一個屬性配置對象作為參數。在這些對象中您可以定義您想要發出的 Ajax 請求的各個方面。再一次說明,這些選項在所有 XHR 函數中都是一樣的。
比較常用的選項:
- url:這是 HTTP 請求的 URL。它必須和發出這一請求的頁面有同樣的域和端口組合。
- handleAs:允許您定義響應的處理格式,默認是 text,但是,json、javascript、xml、還有一些其他選項也可用。在本節后面您將看到一個創建 Ajax 請求的示例,使用一個處理 JSON 響應格式的回調函數。
- form:<form> 元素的一個引用或者字符串 ID 表示。form 中每個字段的值將被同請求一起作為請求體發送。
- content:一個對象,包含您想要傳遞給請求體中資源的參數。如果兩者都提供,這個對象將與從 form 屬性中獲取的值混合在一起。
- load:當 Ajax 請求返回一個成功響應消息時,執行此函數。響應數據和請求對象作為參數被傳遞到這個函數。
- error:如果 Ajax 請求出現問題,該函數將被調用。如果在 Ajax 請求中定義的 URL 無效、請求超時或者發生其他 HTTP 錯誤,這將會出現。錯誤消息和請求對象被作為參數傳遞。
- handle:該函數允許您將加載和錯誤回調函數合並到一個函數中(如果您確實不關心請求結果是成功或是出現錯誤,這將非常有用)。
這幾種類型的請求對於構建一個REST風格的框架很有用,用xhrGet查看數據,xhrPost修改數據,xhrPut創建數據,xhrDelete刪除數據,每一種類型的請求對應一種服務器端具體的操作。
使用iframe進行文件上傳
XHR對於普通的Web請求具有很強的可操作性,但是對於像異步的上傳文件等操作顯得比較棘手,不過沒關系,dojo已經為我們想到了這些。
dojo通過使用iframe的方式實現了這種高級的數據傳輸。筆者曾經使用jquery實現過一個通過iframe異步上傳文件的程序,其原理是將文件的提交的target設置為iframe,這樣在提交時,頁面不會刷新,只有當服務器返回時,才會更新iframe中的內容。這種操作會有進度條,但整個頁面不會刷新,雖然不是完全的無刷新,但用其實現文件上傳絕對的有用。
dojo.io.iframe 是如何工作的呢?除了 XHR 對象之外還有什么方法可以實現表單的異步提交?其實這一切都很簡單,dojo.io.iframe 首先會創建一個隱藏的 iframe 並插入到父頁面的最后,然后設置此 iframe 的 src 屬性為dojo-module-path/resources/blank.html(dojo-module-path 指 dojo 包所在的目錄),iframe 頁面的 onload 事件的處理函數被設置為父窗體的回調函數。接下來就是在 iframe 頁面中發送請求,並接收服務器的響應。當 iframe 接收到服務器的反饋並加載完之后,父窗體的回調函數即被調用。
JSONP:跨域的數據訪問
XHR 框架中的函數功能強大,使用方便。但是 XHR 框架的函數有一問題就是不能跨域訪問,瀏覽器不允許 XHR 對象訪問其他域的站點。
JSONP(JSONP Padding)就是為了解決跨域訪問而產生的:
- 通過<javascript></javascript>標簽訪問封裝JSON數據的地址
- 將要返回的數據封裝為JSON對象
- 數據返回給瀏覽器,並被自動執行
這便是JSONP執行的基本流程,但是想要確定數據是否加載完成並不容易,通常的做法是設置一個回調方法,這個方法的名稱被作為請求參數的一部分發送給服務器,服務器在將數據封裝完整后,生成回調方法執行的代碼,並將這些信息全部返回給客戶端,當客戶端執行返回數據時,回調方法也會被隨之調用。
總結
本文介紹了 Dojo 中三種瀏覽器與服務器交互的方式,這三種方式各有優缺點,但是在使用方式卻出奇的一致; xhr 框架的函數,dojo.io.iframe、dojo.io.script 對象的函數使用的 JSON 對象參數也極其相似,而且淺顯易懂。 Dojo 設計者的這一良好設計極大的減輕了開發人員的學習負擔,作為框架開發人員應該了解這一理念。
下表是對這三種方式從三個方面進行了比較:
支持的 HTTP 請求類型 | 期望的輸出 | 跨域訪問 | |
XHR | Get, post, delete, put | text, json, xml, javascript … | N |
iframe | Get, post | html | N |
script | Get | javascript | Y |
綜上所述,使用上述三種方法時需要遵循一條簡單的原則:傳送文件則 iframe,跨域訪問則使用動態腳本,其余則選 XHR 框架。
本文是作者學習過程中的總結,部分內容引用自一下地址: