【问题标题】:checkbox/backbutton issue depending on the browser复选框/后退按钮问题取决于浏览器
【发布时间】:2012-04-02 06:38:55
【问题描述】:

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

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

这是我理解的场景:

  1. 用户在页面 /page1 然后选中一个复选框
  2. 一个 POST 被创建,有一个 HTTP 重定向
  3. 生成了一个 GET,页面 /page2 显示正常,复选框被选中
  4. 用户点击返回按钮
  5. 用户返回到 /page1,因为它是 选中复选框之前的状态(这正是返回按钮的预期行为)但是 复选框仍处于选中状态。

据我所知,从查看服务器日志和我的应用程序日志来看,绝对没有任何内容传输到网络服务器。因此,事情发生在纯粹是在客户端。

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

编辑我可能应该提供更多信息... webapp 已经有点“花哨”了,因为每个页面都以类似 URL 的方式提供——对应于状态。一切都是“公开的”:任何人都可以看到任何人的页面(但它可以是私有的,带有私有 URL)。无论如何:如果用户共享其页面的任何,当另一个用户打开一个页面时,它应该正确显示并且复选框正确初始化。

所有这一切都表明问题不在服务器端,“状态”在某种程度上是不正确的:如果用户 A 共享页面 .../1d2eof 那么用户 B 打开页面 .../1d2eof应该会看到正确的页面。

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

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

【问题讨论】:

    标签: java web-applications checkbox back


    【解决方案1】:

    这就是我使用隐藏字段和查询字符串的组合解决我的问题的方法。

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

    【讨论】:

    • +1 但是...您应该使用 SO 编辑器格式化您的代码; )
    【解决方案2】:

    你可能想看看http://www.bajb.net/2010/02/browser-back-button-detection/

    当点击后退按钮时,它提供了控制客户端(也可能是使用 ajax 的服务器端)发生的事情的能力。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,我已经掌握了整个状态,所以放回文档/复选框等,因为它们应该不是问题:但我只是不知道如何检测用户何时按下后退按钮:(我还不明白 Zack 在另一个答案中粘贴的代码
      • 有趣的是,旧版本的 Firefox 并没有恢复表单的最终状态:-/ 所以行为似乎因浏览器而异:-/ 我想我应该找到一种方法来检测后退按钮被按下。
      • @CedricMartin:啊,我明白了。关于 Zack Macomber 的链接:它是关于“窃取”后退按钮:当用户点击时,它提供了一种诱使浏览器在当前页面上触发可检测事件的方法,而不是返回页面后退按钮。我不知道这是否适合你。
      • 哦,好的,感谢您的解释:不,这绝对行不通。我会问另一个问题,因为我可能有一个解决方法......(我将在此处添加指向新问题的链接)。
      • 这是我的想法作为一种解决方法,所以它是相关的,但绝对不是同一个问题:stackoverflow.com/questions/9742965/…
      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多