在「AJAX 是什麼?」這篇文章的結尾提到了:因為瀏覽器支援度 ( Browser Compability ) 及 Request 控管的兩大問題,我們必須用市面上的 Javascript Library 來寫 AJAX。本篇就是在介紹 Yahoo! User Interface ( 後續簡稱 YUI ) 的 Connection Manager。
Connection Manager 把每一個 Request 當作是一個連線 (Connection)。而每一個連線就是一個 Js 物件,你可以透過 Connection Manager 所提供的方法、針對每個連線來丟棄 (Abort)、設定 Header、設定例外處理等等...
使用 Connection Manager 的好處有:更好的瀏覽器支援度 (Browser Compability) 、讓你的 Code 更美觀。(Object-Oriented Javascript)
如同「AJAX 是什麼」的 Hello World ! AJAX !! 範例,我們現在想利用 AJAX 去抓一個 HTML
我們在 body 中放置一個 id 為 ajax_container 的 div
Callback 物件是負責處理 Server 端的所傳回的 Response,最基本必須要有兩個子物件 : success 與 failure。
我們已經將所必備的東西皆準備齊全了!只剩下一道執行的指令 : asyncRequest
參數一是指定傳輸方法,後面會繼續介紹 POST,參數二是 Server 端 Request 的網址,參數三是 Callback 物件
唯一要注意的就是我們把是在「網頁讀取完畢」(window.onload) 之後才執行的 ( 範例 )
有了 Connection Manager 後我們可以很輕鬆地將表單以 AJAX 的方式送出喔!
這邊我們多用了 Event Library,讓 AJAX 是由按鈕的點選驅動,這樣更有 AJAX 的感覺了吧?( 範例 )
上傳檔案需要將表單 enctype 屬性設定為 multipart/form-data,XMLHttpRequest 是辦不到這點的。但是各位很幸運,Connection Manager 後來增加了上傳的功能。
它是利用 Iframe,並將表單送出的 target 設定為那個 Iframe,再利用 Javascript 取得 Iframe 頁面傳回的內容。
要怎麼使用呢?你只要替 setForm 多加一個 true 的參數、及設定 enctype 屬性就可以了喔!
用了 Connection Manager 之後我們可以很容易地做出不換頁上傳的功能。( 範例 )
因為我們使用 YAHOO.util.Connect 的次數很高,所以可以設定一下 Reference,不但好寫、效能也會提升!
若你使用 GET 傳送資料,請記得用 encodeURIComponent 替參數值編碼
若你發現不管怎麼變,傳回的值都相同,那麼可能是 Cache 的問題,你可以自己產生 random 參數,讓 Query String 有所不同,瀏覽器就會以為是不同的網址。
如果 Server 傳回的格式是 XML,請務必設定 Header 為 text/xml
絕對不要把所有的 Callback 物件擺在同一個層級,否則名稱不好控制、也不好維護。
有時失敗是因為 encoding 的問題、Response 的頁面必須是 utf-8。( 範例 | 圖片 )
如果你有用 EditPlus v2.20 時,你可以設定快速鍵方便轉換 encodeing : Preferences > Tools > Keyboard > types : document > commands : DocReloadAs,我個人是設定 F8
在我們剛開始開發 AJAX 應用程式時,總是會碰到許多出問題的地方,所以我們在這個階段必須經常性地監控連線的狀況、 Server 傳回的訊息。
而既然是 Connection Manager,其實本身就有控管連線的機制。我們可以利用 Connection Manager 所提供的方法寫一個監控的工具。但如果你跟我一樣是懶人 :p 請多用 Hedgerwow 的 Connection Watcher。
AJAX 一定會有失敗的風險性,通常是因為伺服器錯誤、程式錯誤等。
基本上我們必須設定 Timeout 以避免讓使用者花不必要的等待時間。
此外,有時可用程式把錯誤 Throw 出來提供給前端,如資料筆數為零的情況。