Dojo入門:增強的Ajax功能


隨着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 框架。

 

本文是作者學習過程中的總結,部分內容引用自一下地址:

http://www.ibm.com/developerworks/cn/web/wa-lo-dojointro2/

http://www.ibm.com/developerworks/cn/web/wa-ground/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM