31

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

4

12 回答 12

76

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

此模型比 Postback 模型对返回按钮更友好。

于 2008-09-17T20:41:01.073 回答
12

你不应该。

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

于 2008-09-17T20:44:51.830 回答
8

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

也许您可以考虑提出以下问题:“如何避免破坏 <在此处插入您的场景> 的后退按钮?”

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

于 2008-09-17T20:47:34.337 回答
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>
于 2011-05-04T09:16:58.003 回答
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;
  }

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

于 2008-09-17T21:02:14.080 回答
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> 

详细说明

于 2013-06-18T21:15:27.557 回答
3

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

于 2008-09-17T20:45:25.697 回答
3

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

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

于 2008-09-17T21:50:54.293 回答
1

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

history.go(+1);

这会将用户转发到“收据”,如果他们尝试返回“付款”页面(例如,只需支付),则该“收据”应该出现在“付款”页面之后。不过要谨慎使用

于 2011-12-09T21:34:53.170 回答
0

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

于 2008-09-17T20:45:00.567 回答
0

我能够通过使用:

 Response.Cache.SetExpires(DateTime.MinValue);
 Response.Cache.SetNoStore();

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

于 2011-10-26T18:13:34.723 回答
0

找到下面的链接

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

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

于 2013-04-18T13:30:15.470 回答