禁用浏览器的后退按钮

pri*_*kar 97 javascript asp.net

如何禁用浏览器的BACK按钮(跨浏览器)?

Jon*_*and 60

不要禁用预期的浏览器行为.

让您的页面处理用户返回一两页的可能性; 不要试图削弱他们的软件.

  • 谢谢伙计,问题在于,如果您正在构建一个AJAX应用程序,在禁用后退按钮或通过您的应用程序并为每个可能的方案制定适当的后退操作之间的成本 - 收益权衡可能会导致禁用后退按钮是两者中更具吸引力的选择. (6认同)

Yos*_*sho 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>
Run Code Online (Sandbox Code Playgroud)

它在做什么?

来自评论:

此脚本利用浏览器考虑URL中"#"符号之后的任何内容作为浏览历史记录的一部分.它的作用是:当页面加载时,"#1"被添加到URL.50ms后,"1"被移除.当用户点击"返回"时,浏览器将URL更改回"1"被删除之前的状态,但是 - 它是相同的网页,因此浏览器不需要重新加载页面. - Yossi Shasho

  • 此脚本利用浏览器考虑URL中"#"符号之后的任何内容作为浏览历史记录的一部分.它的作用是:当页面加载时,"#1"被添加到URL.50ms后,"1"被移除.当用户点击"返回"时,浏览器将URL更改回"1"被删除之前的状态,但是 - 它是相同的网页,因此浏览器不需要重新加载页面. (6认同)
  • 你在这段代码片段做什么?你可以解释吗? (2认同)
  • 这个问题是页面每50毫秒滚动到顶部.如果您的表单大于窗口高度,则无法填写表单值. (2认同)

tho*_*ter 34

其他人采取的方法是说"不要这样做",但这并没有真正回答海报的问题.让我们假设每个人都知道这是一个坏主意,但我们很好奇它是如何完成的......

您无法在用户的浏览器上禁用后退按钮,但是如果用户返回,您可以将其设置为使应用程序中断(显示错误消息,要求用户重新开始).

我看到的一种做法是在应用程序内的每个URL上以及每个表单中传递一个令牌.令牌在每个页面上重新生成,一旦用户加载新页面,前一页面中的任何令牌都将失效.

当用户加载页面时,页面将仅显示是否向其传递了正确的令牌(已提供给上一页上的所有链接/表单).

我银行提供的网上银行应用就像这样.如果您完全使用后退按钮,则不再有链接可用,也无法再进行页面重新加载 - 相反,您会看到一条告知您无法返回的通知,而您必须重新开始.


RSo*_*erg 25

这个问题是非常相似,这一个 ...

您需要强制缓存过期才能生效.将以下代码放在您的页面代码后面.

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使页面不可缓存无法实现OP所需的功能:使用后退按钮禁用访问页面.即使浏览器在使用后退按钮时遵循无缓存(浏览器没有义务执行AFAIK),它们仍然提供了重新加载该页面的方法(通常在显示警告对话框后).因此,如果您真的不希望您的用户返回该页面,这可能会更糟,因为对该页面的请求必须一直到原始服务器.您将需要服务器端的某些东西来检测页面是否已被重新访问.标题可以忽略. (14认同)

小智 10

虽然我自己在寻找答案,但"最佳实践"已经过时......就像浏览器一样.(真正的浏览器是丑陋的化石)

最好/最安全的解决方案是浏览器实现方法/请求,其中用户可以授予页面控制界面的能力.

为什么?因为对于我目前的项目,我正在建立一个100%JavaScript构建和控制的界面..并且后退按钮在我的项目中没有位置,因为没有页面更改.(即,因为刷新而血腥快速且没有页面闪烁..就像真正的应用程序!)

我知道为什么"劫持"界面的能力不存在,我明白了.但至少我们应该有能力从浏览器请求它!现在,如果没有劫持危险,那将是真正的"最佳实践".

但浏览器是浏览器..我不希望在这方面出现任何事情.