在浏览器上禁用"后退"按钮

时间:2020-03-05 18:59:59  来源:igfitidea点击:

我正在编写一个应用程序,如果用户回击,它可能会重新发送相同的信息并弄乱数据的流向和完整性。如何为使用和不使用javascript的用户禁用它?

解决方案

回答

不幸的是,这是不可能的。但是,请考虑应用程序导航模型。我们正在使用发布/重定向/获取PRG模型吗? http://en.wikipedia.org/wiki/Post/Redirect/Get?

与回发模型相比,此模型对后退按钮更友好。

回答

你不应该

我们可以将一些脚本添加到页面的onbeforeunload事件中,并与用户确认他们要执行的操作。并且我们可以尝试进一步禁用它,但是当然这仅适用于启用了javascript的用户。而是着眼于重写应用程序,这样我们就不必在每个页面提交时都提交事务,而仅在过程结束时提交事务。

回答

我们可以将每个表单上的数据发布到_NEW窗口。这将禁用每个窗口上的后退按钮,但是如果没有JavaScript,则可能很难强制关闭旧窗口。

回答

这是以前的帖子:
禁止使用"后退"按钮(在IE中)

回答

我强烈敦促我们竭尽全力,以防止破坏后退按钮,这是疏远用户的可靠方法,甚至使它在1999年Jacob Neilsen的十大Web设计错误中名列第一。

也许我们可以考虑问一个问题:"如何避免破坏后退按钮以<在此处插入方案>?

如果Scott的答案接近标准,请考虑将流程更改为PRG模型。如果还有其他问题,请提供更多详细信息,然后看看我们将如何提供帮助。

回答

最好的选择是不要依赖回发来控制流程,但是(如果我们现在仍然)坚持使用它

我们可以使用以下方式:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
  Response.Cache.SetExpires(Now.AddSeconds(-1));
  Response.Cache.SetNoStore();
  Response.AppendHeader("Pragma", "no-cache");

很快,我们会发现它不适用于所有浏览器,但是我们可能会在代码中引入一个检查,例如:

if (Page.IsPostBack)
 {
        if (pageIsExpired()){
           Response.Redirect("/Some_error_page.htm");
        }
        else {
           var now = Now;
           Session("TimeStamp") = now.ToString();
           ViewState("TimeStamp") = now.ToString();
        }

  private boolean pageIsExpired()
  {
     if (Session("TimeStamp") == null || ViewState("TimeStamp") == null)
        return false;

     if (Session("TimeStamp") == ViewState("TimeStamp"))
        return true;

        return false;
  }

这将在某种程度上解决问题,不检查代码-仅出于示例目的。

回答

4名来自Rolla的家伙很久以前(在遥远的星系中)撰写了有关禁用后退按钮的文章:http://www.4guysfromrolla.com/webtech/111500-1.shtml

回答

无论我们想出什么来禁用后退按钮,在将来的浏览器中都可能无法停止后退按钮。

如果它在开发周期的后期,我建议我们尝试上面的一些建议,但是当我们有时间的时候,应该安排流程,以使"后退"按钮不会干扰我们网站的逻辑,它只是将用户带回到上一页他们期望这样做。