項目開發告一段落,喘口氣,總結一下。
1 AJAX還是AJAH
* AJAX的很多經典應用其實都是利用xmlhttp空間訪問后臺程序,后臺程序返回腳本用eval回調或者返回簡單數據的方式來開發。這樣的開發模式的好處是設計簡單輕巧,對熟悉dhtml的開發者來說上手會比較塊,跨瀏覽器問題也容易解決,做簡單的應用也夠用。gmail,google suggest都是用這種方式。但是在我看來gmail已經吧AJAH應用到極限了,更復雜的數據結構用簡單數據和回調方式來組織就開始有點力不從心了。
* 前AJAX的一種傳統做法是后臺返回完整的xml文件后用腳本(利用控件)解析xml后操作頁面的dom節點來動態生成頁面的一部分。這樣作的優點是可以充分利用xml的強大表達能力傳輸各種數據結構,缺點是頁面的dom操作效率不高,而且IE在dom操作的API上bug多多。之所以叫“前AJAX”,因為我們在AJAX這個名詞出現前已經這樣做了很多年了。
* AJAX另一種傳統做法是后臺返回完整的xml文件后用腳本(利用控件)解析xml后生成html代碼再灌回頁面的層中。這樣的做法回避了頁面dom操作的一些問題,在生成的內容比較多的時候利用一些字符串計算的優化技巧(主要是數組和正則的應用)可以相當高效的生成頁面。在我看來這是未來的發展趨勢。
我現在的項目主要采用的是第三種方式,結合第二種。我使用的是自己的一個小巧的框架,模擬jsp的語法來生成html代碼,但是依賴于瀏覽器的xml解析API,因此難以跨瀏覽器。google的開源項目ajaxslt提供了一個純js的xslt解決方式,功能更強大,可以在頁面中局部的應用xslt解析xml生成html或者其他形式的數據,但是帶來了xslt這個技術門檻。sf上的ZK似乎也不錯,但是帶來的是xul這個技術門檻,同時后臺被綁定在了J2EE服務器上面。
2 CACHE
如果使用xmlhttp控件,在發起http請求的時候IE會包辦cache策略,很多時候更新了數據卻無法獲得更新后的數據。一開始試圖用傳統方式在URL后面加隨機數來強制更新,但是IE仍然距不發出新的請求。
一個解決方法是在后臺寫expires: 0或者其他的禁止前臺cache的頭,但是這樣在數據沒有更新的時候又會帶來不必要的服務器壓力、響應延遲和帶寬浪費。
一個稍微好一點的解決方法是,前臺在提交數據以后,需要強制更新數據的時候:
xmlhttp.setRequestHeader("If-Modified-Since","0");
3 系統錯誤: -1072896748。
用xmlhttp接收到數據的時候經常是用xmldom.loadXML(xmlhttp.responseXML.xml)來判斷返回的數據的正確性,但是如果后臺送過來不正確的xml的時候有時回觸發-1072896748系統錯誤。這是因為xmlhttp.responseXML已經沒有解析到東西了,我們還試圖訪問它的xml屬性而觸發的。
解決的方法是在使用responseXML.xml 或者 responseText的時候要做try/catch:
try{var tmp = xmlhttp.responseXML.xml}catch(ex){err=true;}
有些人喜歡catch的時候判斷 exception.description=="系統錯誤: -1072896748。" , 如果客戶端不是簡體中文版的系統的時候就判斷不到了。其實這個地方只要有異常,都必須走異常處理流程了,不用區分的那么仔細。