复选框/后退按钮问题取决于浏览器

时间:2012-03-16 17:42:55

标签: java web-applications checkbox back

我在.jsp / JSTL / EL中实现了一个工作正常的网站。但是,根据浏览器(!),后退按钮的行为会有所不同。

我确实注意没有双重帖子(以便浏览器不会警告用户他将再次发布)但显然这会导致另一个问题:如果我使用Chrome的后退按钮,那么复选框的值是不正确的。

以下是我理解的情景:

  1. 用户在页面 / page1 ,然后选中复选框
  2. 发布了一个POST,这是一个HTTP重定向
  3. 进行GET,页面 / page2 显示正常,选中复选框应该是
  4. 用户点击后退按钮
  5. 用户在选中复选框之前返回 / page1 ,因为它是 (这正是后退按钮的预期行为)但是仍然选中该复选框。
  6. 从我查看服务器的日志和我的应用程序的日志中可以看出,绝对没有任何内容传输到网络服务器。因此,事情正在发生,纯粹是在客户端。

    发生了什么事,我该如何解决这个问题? (不使用框架,这不是这个问题的意思)

    编辑我应该提供更多信息......这个网络应用程序已经有点像#34;幻想"因为每个页面服务 - 以一种像URL一样的小方式 - 对应于一个州。一切都是"公众":任何人都可以看到任何人的页面(但它可以是私人的,有私人网址)。无论如何:如果用户共享其页面的任何,当另一个用户打开一个页面时,它将正确显示并且 正确初始化。

    所有这一切都表明问题不在服务器端,其中"状态"不知何故是不正确的:如果用户A共享页面... / 1d2eof那么用户B打开页面... / 1d2eof将看到正确的页面。

    只有当用户使用后退按钮时才会出现混乱。请记住,在任何时候,我都可以在服务器端访问整页的状态。但是我的问题是,显然当使用后退按钮没有与我的服务器联系时,所以我没有机会去修复页面"对于使用后退按钮的用户。

    也许双重定向会有所帮助!?

3 个答案:

答案 0 :(得分:3)

这是一个浏览器功能:按“后退”按钮将恢复表单的最终状态。如果要将表单内容重置为HTML中指定的内容(即,用户交互之前的状态),可以使用document.formName.reset(),其中formName是表单的名称。 (不幸的是,有点难以检测到用户已经点击“返回”按钮并返回到当前页面,因此弄清楚何时运行上面的代码是很棘手的。)

答案 1 :(得分:3)

这就是我使用hiddenfield和querystring的组合来解决我的问题。

<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" />

答案 2 :(得分:0)

您可能需要查看http://www.bajb.net/2010/02/browser-back-button-detection/

它提供了在单击后退按钮时控制客户端(以及可能是带有ajax的服务器端)发生的事情的能力。