我正在编写一个应用程序,如果用户回击,它可能会重新发送相同的信息并打乱数据的流动和完整性。如何为使用和不使用 javascript 的用户禁用它?
12 回答
这是不可能的,很遗憾。但是,请考虑您的应用程序导航模型。你在使用 Post/Redirect/Get PRG 模型吗?http://en.wikipedia.org/wiki/Post/Redirect/Get ?
此模型比 Postback 模型对返回按钮更友好。
你不应该。
您可以将一些脚本附加到页面的 onbeforeunload 事件并与用户确认他们想要做什么;您可以更进一步尝试禁用它,但当然这只适用于打开了 javascript 的用户。相反,请考虑重写应用程序,这样您就不会在每个提交页面上提交事务,而只是在流程结束时提交。
我强烈敦促您竭尽全力防止破坏后退按钮,这是疏远您的用户的可靠方法,甚至在Jacob Neilsen 的 1999 年十大网页设计错误中排名第一。
也许您可以考虑提出以下问题:“如何避免破坏 <在此处插入您的场景> 的后退按钮?”
如果 Scott 的答案接近分数,请考虑将流程更改为 PRG 模型。如果是其他问题,请提供更多详细信息,看看我们如何提供帮助。
我想出了一个小技巧,可以使用 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>
最好的选择是不要依赖回发来控制流量,但是如果你坚持使用它(现在)
你可以使用这样的东西:
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 行代码放在您的页面中
<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>
这是以前的帖子: 防止使用后退按钮(在 IE 中)
无论您想出什么来禁用后退按钮,都可能不会在未来的浏览器中停止后退按钮。
如果它处于开发周期的后期,我建议您尝试上面的一些建议,但是当您有时间时,您应该构建您的流程,以便后退按钮不会干扰您网站的逻辑,它只是将用户带回到上一页,如他们希望这样做。
确实,应该添加适当的验证以确保重复数据不会搞砸。但是,就我而言,我无法完全控制数据,因为我在表单之后使用了一些第三方 API。所以我用了这个
history.go(+1);
这会将用户转发到“收据”,如果他们尝试返回“付款”页面(例如,只需支付),则该“收据”应该出现在“付款”页面之后。不过要谨慎使用
您可以将每个表单上的数据发布到 _NEW 窗口。这将禁用每个窗口上的后退按钮,但如果没有 javascript,可能很难强制关闭旧窗口。
我能够通过使用:
Response.Cache.SetExpires(DateTime.MinValue);
Response.Cache.SetNoStore();
当我使用 Response.Cache.SetCacheability(HttpCacheability.NoCache); 它阻止我下载办公文件。
找到下面的链接
在 asp.net 中使用 JavaScript 禁用浏览器后退按钮功能 | ASP.Net 禁用浏览器后退按钮(使用 javascript)
http://www.aspdotnet-suresh.com/2011/11/disable-browser-back-button.html