又是一個(gè)拗口的標題!既然是“無(wú)刷新”應用,又何來(lái)“可刷新”的“無(wú)刷新” 應用之說(shuō)呢?其實(shí)一點(diǎn)也不怪——
問(wèn)題
As we 都知道,所謂基于A(yíng)JAX的“無(wú)刷新應用”,一般就是指WEB應用中利用XmlHttp組件來(lái)實(shí)現一定的基于JavaScript后臺異步數據傳遞的無(wú)刷新頁(yè)面切換,以代替傳統的基于HTML鏈接的“有刷新”頁(yè)面切換。
這樣的無(wú)刷新效果真的很酷,但是愛(ài)思考的開(kāi)發(fā)者嘗試一些時(shí)間之后就會(huì )發(fā)現一個(gè)最大的問(wèn)題:我既然是無(wú)刷新了,那么對于一組無(wú)刷新的功能來(lái)說(shuō),也就是從打開(kāi)網(wǎng)頁(yè)起,所有的效果都是在當前頁(yè)面的后臺通過(guò)JavaScript異步調用XmlHttp來(lái)傳遞數據并替換當前頁(yè)中的顯示內容,沒(méi)有傳統的“有刷新”頁(yè)面切換。但是,如果在某個(gè)狀態(tài),因為網(wǎng)絡(luò )問(wèn)題頁(yè)面暫停載入了需要手動(dòng)刷新,或者,用戶(hù)想手動(dòng)刷新一下當前頁(yè)面獲取更新的數據,或者哪怕是不小心按了一下“F5”或瀏覽器上的Refresh按鈕會(huì )怎樣呢?對了,這就是本文的標題提出的擔心。如果沒(méi)有特殊處理,那么,手動(dòng)刷新頁(yè)面過(guò)后,網(wǎng)頁(yè)上的內容自然就回到最初的顯示的內容,而不是手動(dòng)刷新之前我們真正想要的數據了。是不是心中突然又一口悶氣呢?:)大可不必~~
分析
對于以上問(wèn)題,當然是有解決辦法的!如著(zhù)名的AJAX應用網(wǎng)站http://www.backbase.com/就是一個(gè)很好的范例,大家可以親自體驗,無(wú)論在哪個(gè)頁(yè)面手動(dòng)刷新,都不會(huì )發(fā)生我們前面擔心的問(wèn)題~~發(fā)現沒(méi)有呢?發(fā)現其中的玄機沒(méi)?對了,就是“#”??!我們可以看到,每一次無(wú)刷新的頁(yè)面切換之后,瀏覽器地址欄的內容都會(huì )改變,變成了什么呢?改變的內容都是在相同的網(wǎng)址(對于BackBase,自然都是http://www.backbase.com/這個(gè)首頁(yè)了)之后,加上了#xxxx,這是什么呢?熟悉HTML的讀者該想起來(lái)了,什么時(shí)候會(huì )出現這個(gè)“#”呢?對了,就是對我們來(lái)說(shuō)最可愛(ài)最熟悉的,我們的萬(wàn)維網(wǎng)超鏈接的的鼻祖“<a>”。
不知道還有多少讀者記得“#”原本的用處,那就是當前頁(yè)面的內部定位功能。忘記了的朋友可以試試將下面的HTML建一個(gè)test.html,看看簡(jiǎn)單的效果。








如果href中指定的“#”后的內name在指定頁(yè)中沒(méi)有定義,瀏覽器則簡(jiǎn)單的定位到指定頁(yè)的頁(yè)首。除了以一個(gè)鏈接的形式來(lái)調轉之外,也可以通過(guò)修改document.location = ‘test.html#top’ 這樣的方式來(lái)重訂向。凡是這樣跳轉的頁(yè)面,因為實(shí)際上還是在當前頁(yè)面內,因此,網(wǎng)頁(yè)是不會(huì )有物理刷新的。OK,這就是我們實(shí)現“可刷新的無(wú)刷新應用”的方案。
模式
作為一個(gè)設計模式,基于#鏈接的“可刷新的無(wú)刷新應用”的方案對于任意的AJAX框架,或者直接使用未經(jīng)封裝的XmlHttp都是同等適用的。這就要求我們在執行任意一個(gè)AJAX回調時(shí),注意利用#標簽改變當前頁(yè)的url地址,那么,當用戶(hù)刷新頁(yè)面時(shí),由于url中#后的參數不同,就可以在刷新時(shí)通過(guò)解析和判斷當前的#后的參數來(lái)獲得“可刷新的無(wú)刷新”效果。
題外話(huà)
今天將我的輕量級AJAX & JSRS框架AjaxHelper略作了修改封裝,同時(shí)提供一個(gè)支持ASP,PHP,JSP的Flat版本,感興趣的朋友可以在http://ilungasoft.com下載。
另外也談?wù)勗囉肁tlas的感想??傮w來(lái)講,真正值的期待的還是對AJAX效果Web控件的數據綁定和事件的支持,只是現在一切都需要手動(dòng)輸,并且是內遷在HTML中的XML,使用不夠方便,希望正式版的時(shí)候能提供像其它Web控件那樣的可視化向導。除此以外,總體上沒(méi)感覺(jué)比Ajax.Net有太多本質(zhì)提高,也不見(jiàn)得比AjaxHelper使用更靈活。
posted on 2005-11-02 20:31 Teddy‘s Knowledge Base 閱讀(3480) 評論(12) 編輯 收藏 引用 收藏至365Key 所屬分類(lèi): Ajax

聯(lián)系客服