代码之家  ›  专栏  ›  技术社区  ›  Haoest

禁用浏览器上的后退按钮[关闭]

  •  31
  • Haoest  · 技术社区  · 16 年前

    我正在编写一个应用程序,如果用户回击,它可能会重新发送相同的信息,并破坏数据流和完整性。我该如何为启用或不启用javascript的用户禁用它?

    13 回复  |  直到 16 年前
        1
  •  76
  •   Scott Hanselman    16 年前

    可悲的是,这是不可能的。但是,考虑您的应用程序导航模型。您是否使用post/redirect/get-prg模型? http://en.wikipedia.org/wiki/Post/Redirect/Get ?

    此模型比回发模型更友好。

        2
  •  12
  •   blowdart    16 年前

    你不应该这样做。

    您可以将一些脚本附加到页面的onbeforeunload事件,并与用户确认这是他们想要做的;您可以进一步 尝试 disable it 当然,这只适用于打开了javascript的用户。相反,您可以考虑重写应用程序,这样您就不会在提交的每个页面上提交事务,而是只在流程结束时提交。

        3
  •  8
  •   Mike Tunnicliffe    16 年前

    我强烈建议你要不遗余力地阻止“后退”按钮的出现,这是一个让你的用户感到疏远,甚至登上榜首的好方法。 Jacob Neilsen's Top 10 Web Design Mistakes in 1999 .

    也许您可以考虑问这样一个问题:“如何避免为<在此处插入您的方案而中断后退按钮?”

    如果斯科特的回答接近目标,考虑将您的流程更改为PRG模型。如果它是其他的东西,那么请给出更多的细节,看看我们可以如何帮助。

        4
  •  7
  •   Yossi Shasho    14 年前

    我想出了一个使用javascript禁用后退按钮的小技巧。我在Chrome10、火狐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 back!
    </body>
    </html>
    
        5
  •  5
  •   Claus Thomsen    16 年前

    最好的选择不是依赖于回发来控制流,但是如果您(目前)仍然坚持使用它的话。

    您可以使用如下内容:

      Response.Cache.SetCacheability(HttpCacheability.NoCache);
      Response.Cache.SetExpires(Now.AddSeconds(-1));
      Response.Cache.SetNoStore();
      Response.AppendHeader("Pragma", "no-cache");
    

    很快您就会发现它不能在所有浏览器上工作,但随后您可以引入一个签入代码,如:

     if (Page.IsPostBack)
     {
            if (pageIsExpired()){
               Response.Redirect("/Some_error_page.htm");
            }
            else {
               var now = Now;
               Session("TimeStamp") = now.ToString();
               ViewState("TimeStamp") = now.ToString();
            }
    
      private boolean pageIsExpired()
      {
         if (Session("TimeStamp") == null || ViewState("TimeStamp") == null)
            return false;
    
         if (Session("TimeStamp") == ViewState("TimeStamp"))
            return true;
    
            return false;
      }
    

    这将在一定程度上解决问题,代码没有被检查——仅用于示例目的。

        6
  •  4
  •   bugwheels94    11 年前

    可以在所有主要浏览器中禁用后退按钮。它只使用哈希值完全禁用后退按钮。 把这5行代码放到你的页面上

     <script>
    window.location.hash="no-back-button";
    window.location.hash="Again-no-back-button";//for google chrome
    window.onhashchange=function(){window.location.hash="no-back-button";}
    </script> 
    

    Detailed description

        7
  •  3
  •   Community CDub    8 年前
        8
  •  3
  •   Keith    16 年前

    无论您想用什么方法禁用后退按钮,都可能无法在以后的浏览器中停止后退按钮。

    如果它在开发周期的后期,我建议您尝试上面的一些建议,但是当您有时间的时候,您应该组织您的流程,以便后退按钮不干扰您的站点的逻辑,它只是把用户带回到上一页,就像他们期望的那样。

        9
  •  1
  •   katzmopolitan    13 年前

    的确,应该添加适当的验证,以确保重复的数据不会把事情搞砸。但是,和我的情况一样,我不能完全控制数据,因为我在表单后面使用了一些第三方API。所以我用这个

    history.go(+1);
    

    如果用户试图返回“付款”页面(例如支付),这会将用户转发到“收据”,该收据应该在“付款”页面之后出现。但要谨慎使用

        10
  •  0
  •   skamradt    16 年前

    您可以将每个表单上的数据发布到一个新窗口。这将禁用每个窗口上的后退按钮,但如果没有javascript,可能很难强制关闭旧窗口。

        11
  •  0
  •   torial    16 年前

    4个来自罗拉的家伙在很久以前就写了一篇关于禁用后退按钮的文章(在遥远的星系中): http://www.4guysfromrolla.com/webtech/111500-1.shtml

        12
  •  0
  •   user825345    13 年前

    我可以通过以下方式来实现这一点:

     Response.Cache.SetExpires(DateTime.MinValue);
     Response.Cache.SetNoStore();
    

    当我使用response.cache.setcacheability(httpcacheability.nocache)时,它阻止了我下载Office文件。

        13
  •  0
  •   Nimmanagottu    12 年前

    查找以下链接

    使用ASP.NET中的javascript禁用浏览器后退按钮功能ASP.NET禁用浏览器后退按钮(使用javascript)

    http://www.aspdotnet-suresh.com/2011/11/disable-browser-back-button.html