1. 程式人生 > >JavaScript:history.go() 的妙用

JavaScript:history.go() 的妙用

在Web開發中,會遇到從一頁(父頁)導向另一頁(子頁),並且要求“返回”父頁的情況,在這裡如果用ASP.NET提供的Response.Redirect()方法,往往不會達到理想的效果,例如:返回後,重新載入了頁面,無法儲存導向子頁前的狀態,等等,在這裡我就介紹一下如何使用JavaScript中history.go()函式來實現返回功能並且儲存住狀態的方法。 
     這個函式用起來很簡單,只要在頁面上加一個html的input元素,例如: 
     <input type="button" value="返回"> 
     然後再為這個元素新增onclick屬性,如: 
     <input type="button" value="返回" onclick="history.go(-1);"> 

     這樣就能達到返回上一頁的效果。但是,往往在實踐中,並沒有這麼簡單,當你在向伺服器提交請求的時候,引起頁面回發,你再用history.go(-1)這招就不靈啦,它在這裡是返回你回發前的狀態,go後面的引數,實際上就是標識你要返回你回發第前n次的狀態,所以只要能記住回發了幾次,就能用history.go(-n)準確地返回到父頁了。 
     在Web開發中,全域性變數也是存不住的,當頁面回發後,全域性變數的值就會丟失,取而代之的是檢視狀態,所以我們就只能用檢視狀態來記錄回發的次數了。那麼就封裝一個檢視狀態屬性把。 
     public int returnCount 
     { 
         get{ 

               if(ViewState["returnCount"] == null) 
                   ViewState["returnCount"] = 0; 
               return   (int)ViewState["returnCount"]; 
         } 
         set { ViewState["returnCount"] = value ;} 
     } 
     定義好這個後,把他放到Page_Load裡面,讓他每次在頁面回發時減1,這樣就能準確的記住回發了幾次。 
     protected void Page_Load(object sender, EventArgs e) 

     { 
         returnCount--; //要放在!iIsPostBack之外,要不然就僅僅在頁面第一次載入時執行一次,回發時就不執行了。 
         if(!IsPostBack) 
         { 

         } 
     } 
     吼吼,到這一步還沒完呢,要把我們封裝的屬性加到Js裡面。如下: 
     <input type="button" value="返回" onclick="history.go('<% =returnCount %>');"> 
     這下就完美了,管你在頁面上怎麼回發,只要一點這個按鈕,肯定會返回到父業的。 
     注意: 
     1、如果在本頁面上有Response.Redirect()到本頁或者類似的情況,那麼就要將returnCount作為查詢字串傳遞一下了,因為這東西在頁面失效時就over了。 
     2、本文僅對非Ajax的Web系統有作用,Ajax的還沒仔細研究過