【问题标题】:Disabling Back button on the browser [closed]禁用浏览器上的后退按钮 [关闭]
【发布时间】:2010-09-10 09:17:40
【问题描述】:

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

【问题讨论】:

  • 如果我使用的是您的网站,后退按钮仍然是我的。不要乱用我的东西... ;-)
  • 这是个错误的问题。您应该做的是设计应用程序,以便在重新发送信息时,应用程序将识别它并采取适当的行动。

标签: browser back-button


【解决方案1】:

可以在所有主要浏览器中禁用后退按钮。它只是使用哈希值来完全禁用后退按钮。 只需将这 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

【讨论】:

  • 棘手的一个..但有效...
  • @Ankit:太棒了!救了我的命!谢谢!!!
  • 不能在所有情况下正常工作,即 chrome、safari。
  • 请不要这样做!如果页面与基本的浏览器功能混淆,那真的很烦人。
  • 我完全明白我只是回答了它来回答所提出的问题,由读者决定它是否好
【解决方案2】:

找到下面的链接

在asp.net 中使用JavaScript 禁用浏览器后退按钮功能| ASP.Net 禁用浏览器后退按钮(使用 javascript)

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

【讨论】:

    【解决方案3】:

    确实,应该添加适当的验证以确保重复数据不会搞砸。但是,就我而言,我无法完全控制数据,因为我在表单之后使用了一些第三方 API。所以我用了这个

    history.go(+1);
    

    如果用户尝试返回“付款”页面(例如,仅进行付款),这会将用户转发到应该位于“付款”页面之后的“收据”。不过要谨慎使用

    【讨论】:

      【解决方案4】:

      我能够通过使用:

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

      当我使用 Response.Cache.SetCacheability(HttpCacheability.NoCache);它阻止了我下载办公文件。

      【讨论】:

        【解决方案5】:

        我想出了一个小技巧,可以使用 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 back!
        </body>
        </html>
        

        【讨论】:

        • 但它有效 - 继续测试它。
        • 我不怀疑。这对用户来说只是一种糟糕的体验,他们实际上可能想要返回。
        • IE9 不允许我向下滚动查看这个。在最新的 FF、Chrome、Safari 中运行良好。不过,将使用我的单页应用程序的人只能使用 IE
        • 对用户而言,它并不总是糟糕的体验,有时它是正确的体验。例如,页面可以使用 Ajax 更改其状态,例如邮箱当用户点击“返回”时,用户实际上希望页面回到之前的状态,而不是回到之前的页面
        • 虽然不是非常好,但这个解决方案非常适合我正在处理的特定应用程序,并且效果很好。 IE9有问题是有原因的吗?向下滚动时,它会不断跳回页面顶部。我们的 IE9 用户有什么解决方案吗?
        【解决方案6】:

        无论您想出什么来禁用后退按钮,都可能不会在未来的浏览器中停止后退按钮。

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

        【讨论】:

          【解决方案7】:

          最好的选择是不要依赖回发来控制流量,但是如果你坚持使用它(现在)

          你可以使用这样的东西:

            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;
            }
          

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

          【讨论】:

            【解决方案8】:

            我强烈建议你不遗余力地防止破坏后退按钮,这是一种疏远用户的可靠方法,甚至在Jacob Neilsen's Top 10 Web Design Mistakes in 1999 上排名第一。

            也许您可以考虑提出以下问题:“如何避免破坏的后退按钮?”

            如果 Scott 的答案接近分数,请考虑将流程更改为 PRG 模型。如果是其他问题,请提供更多详细信息,看看我们如何提供帮助。

            【讨论】:

            • 他并没有说他想“打破”后退按钮。他希望避免现代 Ajax 设计模式失败的常见陷阱,因为用户按下“返回”,意思是“撤消我刚刚对你的 Ajax 应用程序所做的事情”,而是得到“返回一个任意和模棱两可的 HTTP 请求”。
            • 对我来说,只是读到“他不想破坏后退按钮,他只是想破坏后退按钮以防止它被破坏”。 :S 可以让 AJAX/JavaScript 和后退按钮玩得很好,我建议的只是这将是我建议遵循的路线。
            【解决方案9】:

            这是以前的帖子: Prevent Use of the Back Button (in IE)

            【讨论】:

            • 好吧,推荐引擎在我创建帖子时没有显示它:(
            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              你不应该。

              您可以将一些脚本附加到页面的 onbeforeunload 事件中,并与用户确认他们想要执行的操作;你可以走得更远一点,trydisable it,但当然这只适用于打开了 javascript 的用户。相反,请考虑重写应用程序,这样您就不会在每个提交页面时提交事务,而只是在流程结束时提交。

              【讨论】:

              • Hmmm... onbeforeunload 事件也会在离开页面时被调用,因为用户只是去另一个页面(不仅仅是因为用户按下了后退按钮),并且脚本会被调用.
              【解决方案12】:

              很遗憾,这是不可能的。但是,请考虑您的应用程序导航模型。你在使用 Post/Redirect/Get PRG 模型吗? http://en.wikipedia.org/wiki/Post/Redirect/Get?

              此模型比 Postback 模型对返回按钮更友好。

              【讨论】:

              • 没什么可悲的。
              • 有效点。我只是很难过。 ;)
              • Scott - 那么禁用工具栏和右键菜单 IE 的能力是特定的吗?我见过完全锁定导航的 LOB 应用,但(再次遗憾地)它们还要求用户拥有 IE。
              • 嗯,一些应用程序可以在“Kiosk”模式下自行运行,但这需要使用命令行开关启动 IE。
              • 是否可以在返回按钮引导我们到上一页之前提出确认问题?如果可以,如果取消,请继续原地不动。
              猜你喜欢
              • 2011-08-06
              • 2010-10-31
              • 1970-01-01
              • 2014-04-17
              • 1970-01-01
              • 2012-08-18
              • 2011-04-06
              相关资源
              最近更新 更多