如何禁用浏览器的BACK按钮(跨浏览器)?
答案 0 :(得分:59)
不要禁用预期的浏览器行为。
让您的网页处理用户返回一两页的可能性;不要试图削弱他们的软件。
答案 1 :(得分:46)
我想出了一个使用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”被删除之前的状态,但是 - 它是相同的网页,因此浏览器不需要重新加载页面。 - Yossi Shasho
答案 2 :(得分:34)
其他人采取的方法是说“不要这样做”,但这并没有真正回答海报的问题。让我们假设每个人都知道这是一个坏主意,但我们很好奇它是如何完成的......
您无法在用户的浏览器上禁用后退按钮,但如果用户返回,您可以将其设置为使应用程序中断(显示错误消息,要求用户重新开始)。
我看到过这样做的一种方法是在应用程序内的每个URL上以及每个表单中传递一个令牌。令牌在每个页面上重新生成,一旦用户加载新页面,之前页面中的任何令牌都将失效。
当用户加载页面时,页面将仅显示是否向其传递了正确的令牌(已提供给上一页上的所有链接/表单)。
我银行提供的网上银行应用程序是这样的。如果您完全使用后退按钮,则无法再使用链接,也无法再进行页面重新加载 - 相反,您会看到一条告知您无法返回的通知,而且您必须重新开始。
答案 3 :(得分:24)
此问题与此one非常相似......
您需要强制缓存过期才能生效。将以下代码放在您的页面代码后面。
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
答案 4 :(得分:4)
我正在搜索相同的问题,我在网站上找到了以下代码。想在这里分享一下:
function noBack()
{
window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }
然而,正如上述用户所指出的,这绝不是一种好的做法,应该避免出于各种原因。
答案 5 :(得分:2)
如果您依赖客户端技术,则可以规避它。例如,可能会禁用Javascript。或者用户可以执行JS脚本来解决您的限制。
我的猜测是你只能通过服务器端跟踪用户会话,并将用户/浏览器重定向(如Server.Transfer,而不是Response.Redirect)到所需的页面。
答案 6 :(得分:2)
我也有同样的问题,在head标签上使用这个Java脚本函数,或者在100%正常工作时,不会让你回去。
<script type = "text/javascript" >
function preventBack(){window.history.forward();}
setTimeout("preventBack()", 0);
window.onunload=function(){null};
</script>
答案 7 :(得分:2)
<body onLoad="if(history.length>0)history.go(+1)">
答案 8 :(得分:2)
有一些不同的实现。 IE有一个flash解决方案和一些iframe / frame解决方案。看看这个
BTW:有很多有效的理由要禁用(或至少阻止1步)后退按钮 - 以gmail为例,它实现了上述文章中讨论的哈希解决方案。谷歌“ajax如何打破后退按钮”,你会发现很多关于用户测试的文章以及禁用后退按钮的有效性。
答案 9 :(得分:1)
试试这段代码。为我工作。它通常在页面加载时更改哈希值,通过在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>
答案 10 :(得分:0)
即使我面对同样的情况......也没有任何帮助。 尝试这些可能会对你有用的东西
在登录页面<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();
}
希望这会有所帮助...... :) 有人PLZ教我如何编辑这个页面...
答案 11 :(得分:0)
如果您需要轻轻地抑制Web应用程序中的删除和退格键,那么当他们编辑/删除项目时,页面不会被意外重定向,您可以使用以下代码:
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);
答案 12 :(得分:0)
试试这段代码。 您只需要在母版页中实现此代码,它就可以在所有页面上使用
<script type="text/javascript">
window.onload = function () {
noBack();
}
function noBack() {
window.history.forward();
}
</script>
<body onpageshow="if (event.persisted) noBack();">
</body>
答案 13 :(得分:0)
不是尝试禁用浏览器后退按钮,而是支持它。 .NET 3.5可以很好地处理浏览器后退(和前进)按钮。使用Google搜索:“Scriptmanager EnableHistory”。 您可以控制哪些用户操作将向浏览器的历史记录添加条目(ScriptManager - &gt; AddHistoryPoint),并且只要用户单击浏览器后退/前进按钮,您的ASP.NET应用程序就会收到一个事件。 这适用于所有已知的浏览器
答案 14 :(得分:0)
Yossi Shasho's Code的问题是页面每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(); });
答案 15 :(得分:0)
这似乎对我们有用。
history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
history.pushState(null, null, $(location).attr('href'));
});
答案 16 :(得分:0)
<script>
$(document).ready(function() {
function disableBack() { window.history.forward() }
window.onload = disableBack();
window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
});
</script>
答案 17 :(得分:0)
您应该使用具有正确过期和缓存标题的帖子。