禁用浏览器的后退按钮

时间:2009-06-07 04:17:44

标签: asp.net javascript

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

18 个答案:

答案 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解决方案。看看这个

http://www.contentwithstyle.co.uk/content/fixing-the-back-button-and-enabling-bookmarking-for-ajax-apps

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)

您应该使用具有正确过期和缓存标题的帖子。