Hao*_*est 31 browser back-button
我正在编写一个应用程序,如果用户回击,它可能会重新发送相同的信息并弄乱数据的流和完整性.如何为有和没有javascript的用户禁用它?
Sco*_*man 76
遗憾的是,这是不可能的.但是,请考虑您的应用程序导航模型 您使用的是Post/Redirect/Get PRG Model吗?http://en.wikipedia.org/wiki/Post/Redirect/Get?
此模型比Postback模型更具有后退按钮友好性.
我强烈建议你去英雄,以防止打破后退按钮,它是疏远你的用户的一种确定的火力方式,甚至在1999年Jacob Neilsen的十大网页设计错误中成为第一.
也许您可以考虑提出这样的问题:"如何避免打破<在此处插入您的场景>的后退按钮?"
如果斯科特的回答接近标记,请考虑将您的流程更改为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>
Run Code Online (Sandbox Code Playgroud)
最好的选择是不依靠回发来控制流量,但如果你坚持使用它(现在)
你可以使用这样的东西:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");
Run Code Online (Sandbox Code Playgroud)
很快你会发现它不能在所有浏览器上运行,但是你可以在代码中引入一个检查,如:
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;
}
Run Code Online (Sandbox Code Playgroud)
这将在一定程度上解决问题,代码未经检查 - 仅用于示例目的..
| 归档时间: |
|
| 查看次数: |
42661 次 |
| 最近记录: |