關於網頁返回上一頁並重新整理的問題(C#、WebForm、移動端)
昨天碼程式碼時遇到一個問題,history.back()或go(x)、forward()之後,呼叫重新整理location.reload()方法,怎麼也跳轉不到上一個頁面。在此處寫出昨天產生的一些疑問以及自己的一些理解,希望大家能夠給出合理的指點,謝謝。
實際需求為:完成一個選人介面,移動端Web網頁。(此處具體實現為單頁面後臺資料重新整理,多頁面或Ajax、本地儲存等方式實現的請略過本文)
選人介面,最基本的結構:部門+人員,構成父節點+子節點的結構,選中父節點後重新整理當前介面為選中節點的下級節點。
當進入多子級節點選人時,需要選擇上級節點中的人,則此時需要返回功能,同時,返回後的介面應當儲存上一次選擇的人員的節點選中狀態,選中的節點資料可通過多種方式實現儲存,此處以本地sessionStorage+後臺Session混合校驗儲存的方式進行實現,即將當前操作頁面中選中的節點資料存至SessionStorage中,在頁面的跳轉前事件中,將該值同步至Session中,在頁面的後臺即LoadPage事件中,載入Session中儲存的節點的選中狀態並渲染至前端UI。
嘗試方案一:
網上搜到的答案基本上都是首段描述的方案:history.back();location.reload(),。
在此處提出疑問:這種方式真的能奏效嗎?我實現出來的結果是,重新整理後的介面還是當前介面。錯誤猜想:假設存在3個頁面,page1、page2、page3,現從page1點選後跳轉至page2,此時點選"返回"按鈕,返回上一頁,按照以上的方案,history.back()後,url變為了page1的地址,頁面載入到page1,但是location是為page2中的物件,所以導致在history.back()後呼叫location.reload()時,又重新整理到了page2(此處為猜想,對內部邏輯不是很懂,若有錯還請不吝指出,謝謝!)。
此處該方案Pass,個人感覺如上所述,該方案走不通,請各位解惑。
方案二:
還有一種方案,是通過location.referrer實現,從官方文件來看,這個屬性可以獲取到上一個訪問的地址,可以實現返回的功能,
但是同樣存在漏洞,依舊採用方案一舉的例子進行假設:從page1點選後跳轉至page2,再從page2點選跳轉至page3,此時點選返回,返回至page2,當再次從page2點選跳轉至page3時,問題就出現了。跳轉之間location.referrer的值變化情況如下:
跳轉前頁面 跳轉後頁面 location.referrer值
page1 --> page2 page1.url
page2
page3--> page2 page3.url
page2--> page3 page2.url
page3 --> page2 page3.url
...
可以看出,從page3返回至page2之後再次進入page3,就會出現死迴圈。
所以方案二Pass。
綜上所述,兩種常見的方案均存在漏洞,在此不是指兩種方案不正確,只是提出自己的一些疑問,如果有合理的解釋或者我哪邊用錯了,還請各位能夠指出,在此先謝過了~~~
下面貼一下自己的解決方案,見圖即可: