No pains, No gain
          走過、路過、千萬別錯(cuò)過
          posts - 23,comments - 1,trackbacks - 0

          項(xiàng)目開發(fā)告一段落,喘口氣,總結(jié)一下。

          1 AJAX還是AJAH
          * AJAX的很多經(jīng)典應(yīng)用其實(shí)都是利用xmlhttp空間訪問后臺(tái)程序,后臺(tái)程序返回腳本用eval回調(diào)或者返回簡單數(shù)據(jù)的方式來開發(fā)。這樣的開發(fā)模式的好處是設(shè)計(jì)簡單輕巧,對(duì)熟悉dhtml的開發(fā)者來說上手會(huì)比較塊,跨瀏覽器問題也容易解決,做簡單的應(yīng)用也夠用。gmail,google suggest都是用這種方式。但是在我看來gmail已經(jīng)吧AJAH應(yīng)用到極限了,更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)用簡單數(shù)據(jù)和回調(diào)方式來組織就開始有點(diǎn)力不從心了。

          * 前AJAX的一種傳統(tǒng)做法是后臺(tái)返回完整的xml文件后用腳本(利用控件)解析xml后操作頁面的dom節(jié)點(diǎn)來動(dòng)態(tài)生成頁面的一部分。這樣作的優(yōu)點(diǎn)是可以充分利用xml的強(qiáng)大表達(dá)能力傳輸各種數(shù)據(jù)結(jié)構(gòu),缺點(diǎn)是頁面的dom操作效率不高,而且IE在dom操作的API上bug多多。之所以叫“前AJAX”,因?yàn)槲覀冊(cè)贏JAX這個(gè)名詞出現(xiàn)前已經(jīng)這樣做了很多年了。

          * AJAX另一種傳統(tǒng)做法是后臺(tái)返回完整的xml文件后用腳本(利用控件)解析xml后生成html代碼再灌回頁面的層中。這樣的做法回避了頁面dom操作的一些問題,在生成的內(nèi)容比較多的時(shí)候利用一些字符串計(jì)算的優(yōu)化技巧(主要是數(shù)組和正則的應(yīng)用)可以相當(dāng)高效的生成頁面。在我看來這是未來的發(fā)展趨勢(shì)。

          我現(xiàn)在的項(xiàng)目主要采用的是第三種方式,結(jié)合第二種。我使用的是自己的一個(gè)小巧的框架,模擬jsp的語法來生成html代碼,但是依賴于瀏覽器的xml解析API,因此難以跨瀏覽器。google的開源項(xiàng)目ajaxslt提供了一個(gè)純js的xslt解決方式,功能更強(qiáng)大,可以在頁面中局部的應(yīng)用xslt解析xml生成html或者其他形式的數(shù)據(jù),但是帶來了xslt這個(gè)技術(shù)門檻。sf上的ZK似乎也不錯(cuò),但是帶來的是xul這個(gè)技術(shù)門檻,同時(shí)后臺(tái)被綁定在了J2EE服務(wù)器上面。

          2 CACHE
          如果使用xmlhttp控件,在發(fā)起http請(qǐng)求的時(shí)候IE會(huì)包辦cache策略,很多時(shí)候更新了數(shù)據(jù)卻無法獲得更新后的數(shù)據(jù)。一開始試圖用傳統(tǒng)方式在URL后面加隨機(jī)數(shù)來強(qiáng)制更新,但是IE仍然距不發(fā)出新的請(qǐng)求。
          一個(gè)解決方法是在后臺(tái)寫expires: 0或者其他的禁止前臺(tái)cache的頭,但是這樣在數(shù)據(jù)沒有更新的時(shí)候又會(huì)帶來不必要的服務(wù)器壓力、響應(yīng)延遲和帶寬浪費(fèi)。
          一個(gè)稍微好一點(diǎn)的解決方法是,前臺(tái)在提交數(shù)據(jù)以后,需要強(qiáng)制更新數(shù)據(jù)的時(shí)候:

          xmlhttp.setRequestHeader("If-Modified-Since","0");

          3 系統(tǒng)錯(cuò)誤: -1072896748。
          用xmlhttp接收到數(shù)據(jù)的時(shí)候經(jīng)常是用xmldom.loadXML(xmlhttp.responseXML.xml)來判斷返回的數(shù)據(jù)的正確性,但是如果后臺(tái)送過來不正確的xml的時(shí)候有時(shí)回觸發(fā)-1072896748系統(tǒng)錯(cuò)誤。這是因?yàn)閤mlhttp.responseXML已經(jīng)沒有解析到東西了,我們還試圖訪問它的xml屬性而觸發(fā)的。
          解決的方法是在使用responseXML.xml 或者 responseText的時(shí)候要做try/catch:
          try{var tmp = xmlhttp.responseXML.xml}catch(ex){err=true;}
          有些人喜歡catch的時(shí)候判斷 exception.description=="系統(tǒng)錯(cuò)誤: -1072896748。" , 如果客戶端不是簡體中文版的系統(tǒng)的時(shí)候就判斷不到了。其實(shí)這個(gè)地方只要有異常,都必須走異常處理流程了,不用區(qū)分的那么仔細(xì)。

          posted on 2006-09-12 12:04 一縷青煙 閱讀(90) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 合川市| 逊克县| 双峰县| 东安县| 乌拉特前旗| 防城港市| 萨迦县| 华池县| 巫溪县| 奉节县| 砀山县| 永泰县| 麻阳| 广州市| 乐亭县| 寻甸| 象州县| 潍坊市| 房山区| 许昌市| 安新县| 莱阳市| 安西县| 巴彦淖尔市| 晋宁县| 若羌县| 灵宝市| 公安县| 新龙县| 六盘水市| 马边| 青铜峡市| 鹿邑县| 江西省| 武平县| 蚌埠市| 宣城市| 二连浩特市| 依安县| 伊金霍洛旗| 杂多县|