2012-03-16 33 views
3

我已經在.jsp/JSTL/EL中實現了一個可以正常工作的網站。但是,根據瀏覽器(!),後退按鈕的行爲有所不同。另一個複選框/後退問題

我確實注意不要有雙重帖子(這樣瀏覽器不會警告用戶他會再次發帖),但顯然這導致了另一個問題:如果我使用Chrome後退按鈕,那麼複選框的值不正確。

這裏的情況我瞭解:

  1. 用戶頁面/第1頁上然後檢查複選框
  2. 一個POST製成,有一個HTTP重定向
  3. 一個GET製成,頁/2頁顯示細膩,通過選中複選框,因爲它應該是
  4. 用戶點擊後退按鈕
  5. 使用r回到/page1,因爲它是之前複選框被選中(這正好是後退按鈕的預期行爲)複選框仍然被選中。

從我看到服務器的日誌和我的應用程序的日誌,據我所知,沒有任何東西傳輸到網絡服務器。所以事情正在發生,純粹是在客戶端。

這是怎麼回事,我該如何解決這個問題? (不使用框架,它不是這個問題是關於什麼的)

編輯我也許應該給予更多的信息.​​.. web應用程序已經在每個網頁中投放--in一個有點「神奇」小網址般的時尚 - 對應一個國家。一切都是「公開」的:任何人都可以看到任何人的網頁(但它可能是私人的,使用私人網址)。無論如何:如果用戶分享其頁面的任何,則當另一用戶打開頁面時,它應該正確顯示並且複選框正確初始化。

所有這一切都說,問題不在於服務器端,其中「狀態」以某種方式不正確:如果用戶A共享頁面.../1d2eof,則用戶B打開頁面.../1d2eof應該看到正確的頁面。

只有當用戶使用後退按鈕時,這種情況纔會變得混亂。請記住,在任何時候,我都可以在服務器端訪問整個頁面的狀態。然而,我的問題是,顯然當使用後退按鈕什麼都沒有聯繫我的服務器,所以我沒有機會爲使用後退按鈕的用戶「修復頁面」。

也許雙重定向會有幫助!?

回答

3

這是一個瀏覽器功能:按「後退」按鈕將恢復表單的最終狀態。如果您想要將表單內容重置爲HTML中指定的內容(即用戶交互前的狀態),則可以使用document.formName.reset(),其中formName是表單的名稱。 (不幸的是,檢測用戶點擊「返回」按鈕並返回到當前頁面有點困難,所以確定何時運行上述代碼很困難。)

+0

燁我有這麼放回文件/複選框等整個狀態,他們應該不是一個問題,但我只是不知道如何當用戶按下後退按鈕檢測:(我不明白Zack在其他答案 – 2012-03-16 18:41:44

+0

中粘貼的代碼顯然老版本的Firefox並沒有恢復表單的最終狀態: - /所以行爲似乎因瀏覽器而異: - /我想我應該找到一種方法來檢測後退按鈕被按下 – 2012-03-16 18:42:38

+0

@CedricMartin:啊,我明白了關於Zack Macomber的鏈接:它是關於「竊取」後退按鈕:它提供了一種欺騙瀏覽器觸發當前頁面上的可檢測事件*,而不是返回頁面*,當用戶單擊後退按鈕時,我不知道這是否會爲你工作。 – ruakh 2012-03-16 18:45:15

3

這就是我如何使用hiddenfield和查詢字符串的組合來解決我的問題。

<script type="text/javascript"> 
    jQuery(document).ready(function() { 

    if (!(window.location.toString().indexOf('&FIP') >= 0) && (document.getElementById("<%= hdnField.ClientID %>").value.toString() == "BackButtonClickIsSet")) { 
     document.location.reload(true); 
    } 

    if (!(window.location.toString().indexOf('&FIP') >= 0)) { 
     document.getElementById("<%= hdnField.ClientID %>").value = "BackButtonClickIsSet"; 
    } 

    if (window.location.toString().indexOf('&FIP') >= 0) { 
     document.getElementById("<%= hdnField.ClientID %>").value = "BackButtonClickIsNotSet"; 
    } 

}); 
</script> 


<asp:HiddenField ID="hdnField" runat="server" Value="BackButtonHiddenField" /> 
+0

+1但是...你應該使用SO編輯器來格式化你的代碼; ) – 2012-10-03 15:47:00

+0

+1,因爲我從你的答案中得到了解決方案。 – pkachhia 2013-02-04 09:31:06