禁用浏览器的后退button
如何禁用浏览器的后退button(跨浏览器)?
这个问题跟这个很相似
你需要强制caching过期才能工作。 在你的页面代码后面放置下面的代码。
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
不要禁用预期的浏览器行为。
让你的页面处理用户返回一两页的可能性; 不要试图削弱他们的软件。
我想出了一个黑客使用JavaScript禁用后退button。 我检查了铬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>
它在做什么?
来自评论:
这个脚本利用了浏览器将浏览历史logging中的“#”符号之后的任何内容都考虑在内的事实。 它的作用是:当页面加载时,“#1”被添加到URL中。 50ms后,“1”被删除。 当用户点击“返回”时,浏览器将URL改回到“1”被移除之前的状态,但是 – 这是相同的网页,所以浏览器不需要重新加载页面。 – Yossi Shasho
其他人则采取了这样的方式,说“不要这样做”,但这并不能真正回答海报的问题。 让我们假设每个人都知道这是一个坏主意,但是我们好奇它是如何完成的。
您不能禁用用户浏览器上的后退button,但是如果用户返回,则可以使应用程序中断(显示错误消息,要求用户重新开始)。
我所看到的做法之一是在应用程序中的每个URL上以及每个表单中传递一个令牌。 每个页面都会重新生成令牌,一旦用户加载新页面,前一页中的任何令牌都将失效。
当用户加载一个页面时,页面只会显示正确的标记(这是给予前一页上的所有链接/表单)。
我的银行提供的在线银行应用程序就是这样的。 如果你使用后退button,没有更多的链接将工作,没有更多的页面重新加载 – 而是你看到一个通知,告诉你,你不能回去,你必须重新开始。
在不知情的情况下谴责这个问题有点苛刻。 例如,我想知道这样做的正确方法:目前我正在运行在线心理学实验,有时候参与者按下后退button(退格或在Mac上删除)而不是input键,意外地。 这可能会搞砸实验,从而毁坏数据(幸好还没有发生)。 这显然是input需要被限制的情况。
当然,我也同意在这个规则中,这是一个非常糟糕的主意……但是已经有了明确的说明。
当我自己寻找答案的时候,“最佳实践”是….过时了…就像浏览器一样(真的是浏览器是丑化石)
最好/最安全的解决scheme将是浏览器实现一个方法/请求,用户可以授予页面控制界面的能力。
为什么? 因为对于我目前的项目,我正在构build一个100%的JavaScript构build和控制的界面..后退button在我的项目中没有地方,因为没有页面更改。 (即血腥快速,没有页面闪烁,因为刷新..就像一个真正的应用程序!)
我知道为什么“劫持”界面的能力不在那里,而我理解它。 但至less我们应该有能力从浏览器请求它! 如果没有劫匪的危险,那真的是“最佳实践”。
但浏览器是浏览器..我不期望在这方面发生任何事情。
我正在寻找相同的问题,我发现一个网站上的以下代码。 想在这里分享一下:
function noBack() { window.history.forward() } noBack(); window.onload = noBack; window.onpageshow = function(evt){ if(evt.persisted) noBack(); } window.onunload = function(){ void(0); }
但是,正如上述用户所指出的那样,这不是一个好的做法,应该避免出于所有原因。
如果您依赖于客户端技术,则可以规避。 例如,Javascript可能被禁用。 或者用户可能会执行一个JS脚本来解决你的限制。
我的猜测是,只能通过服务器端跟踪用户会话来完成此操作,并将用户/浏览器(如Server.Transfer,而不是Response.Redirect)redirect到所需的页面。
<body onLoad="if(history.length>0)history.go(+1)">
有几个不同的实现。 有一个Flash解决scheme和一些IE浏览器的iframe /框架解决scheme。 看看这个
顺便说一句:有很多有效的理由来禁用(或至less防止1步)一个后退button – 看看gmail作为一个例子,实现上面讨论的散列解决scheme。
谷歌“如何阿贾克斯打破了后退button”,你会发现大量的文章关于用户testing和禁用后退button的有效性。
我也有同样的问题,在head标签上使用这个Java脚本函数,或者100%正常工作,不会让你回头。
<script type = "text/javascript" > function preventBack(){window.history.forward();} setTimeout("preventBack()", 0); window.onunload=function(){null}; </script>
您应该使用正确过期和caching标题的post。
而不是试图禁用浏览器后退button,最好是支持它。 .NET 3.5可以很好地处理浏览器返回(和转发)button。 用Googlesearch:“Scriptmanager EnableHistory”。 您可以控制哪些用户操作将向浏览器的历史添加条目(ScriptManager – > AddHistoryPoint),并且无论用户何时单击浏览器的Back / Forwardbutton,ASP.NET应用程序都会收到一个事件。 这将适用于所有已知的浏览器
在全球范围内,禁用后退button确实是不好的做法。 但是,在某些情况下,后退buttonfunction没有意义。
这是防止页面之间不需要的导航的一种方法:
首页(文件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>"; } ?>
其效果是允许使用自己的链接从首页导航到第二页并返回(例如取消)。 但是,返回到首页后,浏览器后退button被禁止导航到辅助页面。
即使我面临同样的情况,并没有任何帮助。 尝试这些东西,也许这些会为你工作
在login页面<head>
标签:
<script type="text/javascript"> window.history.forward(); </script>
在注销button我做到了这一点:
protected void Btn_Logout_Click(object sender, EventArgs e) { connObj.Close(); Session.Abandon(); Session.RemoveAll(); Session.Clear(); HttpContext.Current.Session.Abandon(); }
和login页面我已经把重点放在用户名文本框这样的:
protected void Page_Load(object sender, EventArgs e) { _txtUsername.Focus(); }
希望这有助于… :)有人PLZ教我如何编辑此页面…
如果您需要轻轻地抑制Web应用程序中的删除和退格键,以便在编辑/删除项目时页面不会意外redirect,您可以使用以下代码:
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(); });
这似乎为我们工作。
history.pushState(null, null, $(location).attr('href')); window.addEventListener('popstate', function () { history.pushState(null, null, $(location).attr('href')); });