禁用浏览器上的“后退”按钮

时间:2008-09-17 20:39:23

标签: browser back-button

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

13 个答案:

答案 0 :(得分:76)

遗憾的是,这是不可能的。但是,请考虑您的应用程序导航模型您使用的是Post / Redirect / Get PRG Model吗? http://en.wikipedia.org/wiki/Post/Redirect/Get

此模型比Postback模型更具有后退按钮友好性。

答案 1 :(得分:12)

你不应该。

您可以将一些脚本附加到页面的onbeforeunload事件,并与用户确认他们想要做什么;你可以更进一步,尝试disable it但当然这只适用于打开javascript的用户。而是考虑重写应用程序,这样您就不会在每个页面提交时提交事务,而只是在流程结束时提交。

答案 2 :(得分:8)

我强烈建议你去英雄,以防止打破后退按钮,这是疏远你的用户,甚至在Jacob Neilsen's Top 10 Web Design Mistakes in 1999上达到No.1的确定方法。

也许您可以考虑提出这样的问题:“如何避免违反后退按钮<在此处插入您的方案>?”

如果Scott的回答接近标记,请考虑将您的流程更改为PRG模型。如果它是其他的东西,那么请提供更多细节,看看我们如何提供帮助。

答案 3 :(得分:7)

我想出了一个使用JavaScript禁用后退按钮的小黑客。我在chrome 10,firefox 3.6和IE9上检查了它:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
     window.location.href += "#";
     setTimeout("changeHashAgain()", "50"); 
}

function changeHashAgain() {
  window.location.href += "1";
}

var storedHash = window.location.hash;
window.setInterval(function () {
    if (window.location.hash != storedHash) {
         window.location.hash = storedHash;
    }
}, 50);


</script>
</head>
<body onload="changeHashOnLoad(); ">
Try to hit back!
</body>
</html>

答案 4 :(得分:5)

最好的选择是不依靠回发来控制流量,但如果你坚持使用它(暂时)

你可以使用这样的东西:

  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;
  }

这将在一定程度上解决问题,未检查代码 - 仅用于示例目的..

答案 5 :(得分:4)

可以在所有主流浏览器中禁用后退按钮。它只是使用哈希值来完全禁用后退按钮。 只需将这5行代码放入页面

即可
 <script>
window.location.hash="no-back-button";
window.location.hash="Again-no-back-button";//for google chrome
window.onhashchange=function(){window.location.hash="no-back-button";}
</script> 

Detailed description

答案 6 :(得分:3)

这是上一篇文章: Prevent Use of the Back Button (in IE)

答案 7 :(得分:3)

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

如果它在开发周期的后期我建议您尝试上面的一些建议,但是当你有时间时你应该构建你的流程,以便后退按钮不会干扰你网站的逻辑,它只需要用户回到上一页就像他们期望的那样。

答案 8 :(得分:1)

确实,应该添加适当的验证以确保重复数据不会搞砸。但是,就我而言,由于我在表单后使用了一些第三方API,因此我无法完全控制数据。所以我用了这个

history.go(+1);

如果他们试图返回“付款”页面(仅举行付款),这将向用户发送“收据”,该收据应该在“付款”页面之后。虽然

,但要谨慎使用

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

我能够通过使用:

来实现这一目标
 Response.Cache.SetExpires(DateTime.MinValue);
 Response.Cache.SetNoStore();

当我使用Response.Cache.SetCacheability(HttpCacheability.NoCache)时;它阻止我下载办公室文件。

答案 12 :(得分:0)

查找以下链接

在asp.net中使用JavaScript禁用浏览器后退按钮功能ASP.Net禁用浏览器后退按钮(使用javascript)

http://www.aspdotnet-suresh.com/2011/11/disable-browser-back-button.html