如何禁用浏览器的“后退”按钮(跨浏览器)?
如何禁用浏览器的“后退”按钮(跨浏览器)?
Answers:
这个问题是非常相似,这一个 ...
您需要强制使缓存过期才能使其正常工作。将以下代码放在页面代码后面。
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
不要禁用预期的浏览器行为。
使您的页面处理用户返回一两个页面的可能性;不要试图削弱他们的软件。
我想出了一个小技巧,可以使用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 the back button!
</body>
</html>
到底在做什么
来自评论:
该脚本利用了以下事实:浏览器会考虑将URL中“#”符号后的内容作为浏览历史的一部分。它的作用是:加载页面时,会将“#1”添加到URL。50ms之后,“ 1”被删除。当用户单击“后退”时,浏览器会将URL改回删除“ 1”之前的URL,但是-这是同一网页,因此浏览器不需要重新加载该页面。– Yossi Shasho
其他人则采取了“不这样做”的方法,但这并不能真正回答张贴者的问题。让我们假设每个人都知道这是个坏主意,但是我们很好奇它的完成方式……
您不能禁用用户浏览器上的“后退”按钮,但是可以这样做,以便在用户返回时您的应用程序中断(显示错误消息,要求用户重新开始)。
我见过的一种这样做的方法是在应用程序内的每个URL以及每个表单内的每个URL上传递令牌。在每个页面上都会重新生成令牌,并且一旦用户加载新页面,来自先前页面的所有令牌都会失效。
当用户加载页面时,该页面将仅显示是否向其传递了正确的令牌(该令牌已分配给上一页上的所有链接/表单)。
我的银行提供的在线银行应用程序就是这样。如果您完全使用“后退”按钮,则将无法再使用任何链接,也无法进行任何页面重新加载-而是看到一条通知,告诉您您无法返回,必须重新开始。
当我自己寻找答案时,“最佳实践”已经过时了……就像浏览器一样。(实际上,浏览器是丑陋的化石)
最好/最安全的解决方案是让浏览器实现方法/请求,使用户可以授予页面控制界面的能力。
为什么?因为对于我当前的项目,我正在构建100%构建和控制的JavaScript接口。并且由于没有页面更改,因此后退按钮在我的项目中没有位置。(即刷新速度很快,并且由于刷新而没有页面闪烁。就像真正的应用程序一样!)
我知道为什么不存在“劫持”界面的功能,并且我理解它。但是至少我们应该能够从浏览器中请求它!现在,在没有高风险的情况下,这实际上将是“最佳实践”。
但是浏览器就是浏览器..我不希望这方面发生任何事情。
我在搜索相同的问题,但在网站上发现以下代码。想在这里分享:
function noBack()
{
window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }
但是,正如上述用户所指出的那样,这永远不是一个好习惯,应出于所有原因避免使用。
有几种不同的实现。有一个Flash解决方案和一些针对IE的iframe / frame解决方案。看看这个
顺便说一句:禁用(或至少阻止1步)后退按钮有很多有效的理由-以gmail为例,该示例实现了以上文章中讨论的哈希解决方案。
Google“ ajax如何破坏后退按钮”,您会发现很多关于用户测试以及禁用后退按钮有效性的文章。
我也有同样的问题,在head标签上或中使用此Java脚本功能,其100%工作正常,不会让您返回。
<script type = "text/javascript" >
function preventBack(){window.history.forward();}
setTimeout("preventBack()", 0);
window.onunload=function(){null};
</script>
试试这个代码。为我工作。页面加载后,它基本上会更改哈希值,这会通过在URL上添加“ 1”来更改最近的历史记录页面。因此,当您单击“后退”按钮时,它每次都会重定向到同一页面。
<script type="text/javascript">
var storedHash = window.location.hash;
function changeHashOnLoad() { window.location.hash = "1";}
window.onhashchange = function () {
window.location.hash = storedHash;
}
</script>
<body onload="changeHashOnLoad(); ">
</bod>
在全球范围内,禁用后退按钮确实是一种不好的做法。但是,在某些情况下,后退按钮功能没有意义。
这是防止页面之间不必要的导航的一种方法:
首页(文件top.php):
<?php
session_start();
$_SESSION[pid]++;
echo "top page $_SESSION[pid]";
echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>
第二页(文件secondary.php):
<?php
session_start();
if ($_SESSION[pid] != $_GET[pid])
header("location: top.php");
else {
echo "secondary page $_SESSION[pid]";
echo "<BR><a href='top.php'>top</a>";
}
?>
效果是允许使用您自己的链接从首页向前导航到第二页,然后再返回(例如,取消)。但是,返回首页后,浏览器后退按钮将无法导航到第二页。
甚至我以前也遇到过同样的情况……并且没有任何帮助。试试这些吧,也许这些对你有用
在登录页面<head>标签中:
<script type="text/javascript">
window.history.forward();
</script>
在注销按钮中,我这样做:
protected void Btn_Logout_Click(object sender, EventArgs e)
{
connObj.Close();
Session.Abandon();
Session.RemoveAll();
Session.Clear();
HttpContext.Current.Session.Abandon();
}
在登录页面上,我将注意力集中在“用户名”文本框上,如下所示:
protected void Page_Load(object sender, EventArgs e)
{
_txtUsername.Focus();
}
希望对您有所帮助... :)有人请教我如何编辑此页面...
如果您需要在Web应用程序中轻轻地按下Delete键和Backspace键,以使它们在编辑/删除项目时不会意外地重定向页面,则可以使用以下代码:
window.addEventListener('keydown', function(e) {
var key = e.keyCode || e.which;
if (key == 8 /*BACKSPACE*/ || key == 46/*DELETE*/) {
var len=window.location.href.length;
if(window.location.href[len-1]!='#') window.location.href += "#";
}
},false);
试试这个代码。您只需要在母版页中实现此代码,它将在所有页面上为您工作
<script type="text/javascript">
window.onload = function () {
noBack();
}
function noBack() {
window.history.forward();
}
</script>
<body onpageshow="if (event.persisted) noBack();">
</body>
Yossi Shasho的代码的问题在于页面每50毫秒滚动到顶部。所以我修改了该代码。现在,它可以在所有现代浏览器(IE8及更高版本)上正常工作
var storedHash = window.location.hash;
function changeHashOnLoad() {
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
}
function changeHashAgain() {
window.location.href += "1";
}
function restoreHash() {
if (window.location.hash != storedHash) {
window.location.hash = storedHash;
}
}
if (window.addEventListener) {
window.addEventListener("hashchange", function () {
restoreHash();
}, false);
}
else if (window.attachEvent) {
window.attachEvent("onhashchange", function () {
restoreHash();
});
}
$(window).load(function () { changeHashOnLoad(); });