我正在编写一个应用程序,如果用户回击,它可能会重新发送相同的信息并弄乱数据的流和完整性。如何为有和没有javascript的用户禁用它?
答案 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>
答案 6 :(得分:3)
答案 7 :(得分:3)
无论您想出什么来禁用后退按钮,都可能无法在将来的浏览器中停止后退按钮。
如果它在开发周期的后期我建议您尝试上面的一些建议,但是当你有时间时你应该构建你的流程,以便后退按钮不会干扰你网站的逻辑,它只需要用户回到上一页就像他们期望的那样。
答案 8 :(得分:1)
确实,应该添加适当的验证以确保重复数据不会搞砸。但是,就我而言,由于我在表单后使用了一些第三方API,因此我无法完全控制数据。所以我用了这个
history.go(+1);
如果他们试图返回“付款”页面(仅举行付款),这将向用户发送“收据”,该收据应该在“付款”页面之后。虽然
,但要谨慎使用答案 9 :(得分:0)
您可以将每个表单上的数据发布到_NEW窗口。这将禁用每个窗口上的后退按钮,但如果没有javascript,可能很难强制关闭旧窗口。
答案 10 :(得分:0)
答案 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