背景:在ajax的應用中,由於頁面不重新整理,如果操作都在一個頁面上,瀏覽器將不會記住每個操作的狀態,這樣就會產生一個問題:使用者在click幾次之後,想回到先前某一次click
的結果(或者直接想回去上一次操作的結果),就會點擊瀏覽器的前進或者後退按鈕,這時候問題就出來了。由於URL始終沒有發生變化,點擊瀏覽器的前進後退按鈕,出現
的結果,將不會是使用者希望看到的。
互連網上已有的實現:gmail, dropbox, facebook, etc.(已經有越來越多的應用用這種方式來實現)
1. 做法:
寫一個定時器不斷地去讀url hash值(location.hash)的變化(只有url hash有變化,html中叫anchor),然後根據hash值的變化,取得相應的顯示資料。
2.問題:
1. Firefox下取得location.hash時,firefox會自動地額外做一次decode,導致使用這個值時不對(你可能會說,它decode一次,我再encode一次<用javascript的
encodeURIComponent函數>不就OK了?答案是不行。因為firefox只會decode那些可以decode的值,如果碰上URL hash裡正好帶上了一個%2B或者%25這種URL編碼
的字 符,firefox會自動地把它decode成另外一個字元,問題就來了)。比如我某個時刻的URL hash值是abc%25def,在javascript裡用location.hash取到的值,就會
是abc%def, 顯然,結果不是我們想要的
2. IE 6,7對於URL只有hash部分有變化的情況,不會在它的記錄裡記錄URL hash的不同,這也就導致使用URL hash navigation在IE6,7下點擊前面或者後退的按鈕,也
不會得到我們想要的結果!!!
解決辦法:
1. 很顯示,這個問題有各種辦法可以解決(因為我們最終的目的是要一個正確的URL hash值,不管使用什麼辦法,我們肯定有辦法得出這樣一個結果),最常用的是在客
戶端把%替換成%的URL編碼%25,然後在伺服器解碼一次,這樣不論瀏覽器。始終能得到一個正確的結果(因為在伺服器端解碼,會把%25還原成%).
2. 現在只知道通過在頁面中加入一個hidden的iframe,通過iframe記住IE6,7下URL hash值的變化記錄,來實作類別似的效果。不知道還有什麼其它的好辦法!