我在.jsp / JSTL / EL中实现了一个工作正常的网站。但是,根据浏览器(!),后退按钮的行为会有所不同。
我确实注意没有双重帖子(以便浏览器不会警告用户他将再次发布)但显然这会导致另一个问题:如果我使用Chrome的后退按钮,那么复选框的值是不正确的。
以下是我理解的情景:
从我查看服务器的日志和我的应用程序的日志中可以看出,绝对没有任何内容传输到网络服务器。因此,事情正在发生,纯粹是在客户端。
发生了什么事,我该如何解决这个问题? (不使用框架,这不是这个问题的意思)
编辑我应该提供更多信息......这个网络应用程序已经有点像#34;幻想"因为每个页面服务 - 以一种像URL一样的小方式 - 对应于一个州。一切都是"公众":任何人都可以看到任何人的页面(但它可以是私人的,有私人网址)。无论如何:如果用户共享其页面的任何,当另一个用户打开一个页面时,它将正确显示并且 正确初始化。
所有这一切都表明问题不在服务器端,其中"状态"不知何故是不正确的:如果用户A共享页面... / 1d2eof那么用户B打开页面... / 1d2eof将看到正确的页面。
只有当用户使用后退按钮时才会出现混乱。请记住,在任何时候,我都可以在服务器端访问整页的状态。但是我的问题是,显然当使用后退按钮没有与我的服务器联系时,所以我没有机会去修复页面"对于使用后退按钮的用户。
也许双重定向会有所帮助!?
答案 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的服务器端)发生的事情的能力。