用户发现,如果提交信息并进入带有注释的页面,然后"/>

关于javascript:防止使用”后退”按钮(在IE中)

关于javascript:防止使用”后退”按钮(在IE中)

Prevent Use of the Back Button (in IE)

因此,我目前的工作地点的中小企业希望尝试禁用某些页面的"后退"按钮。我们有一个页面,用户可以在其中进行一些选择并将其提交进行处理。在某些情况下,他们必须在另一页上输入评论。

用户发现,如果提交信息并进入带有注释的页面,然后单击返回按钮以返回上一页,则无需输入注释。

我知道有多种解决方案(许多方法要优雅得多,然后禁用后退按钮),但这就是我剩下的。是否可以通过更改"后退"按钮的行为来防止某人返回上一页。 (就像提交->返回错误的sorta一样)。

由于两次发布信息,我无法让它返回到上一页,然后移至当前页面。我只能让它不直接离开当前页面。我用Google搜索了它,但是我只看到帖子说它将始终返回到上一页。我希望有人拥有一些疯狂的功夫js技能,可以使之成为可能。

我了解到每个人都说这是一个坏主意,我同意,但是有时候您只需要按照所告诉的去做。


请勿这样做,请不要这样做。这是不良的界面设计,它会迫使用户的浏览器以他们意想不到的方式运行。

我会将成功阻止后退按钮正常工作的任何脚本都视为黑客,并且我希望IE团队为其发布安全修复程序。

后退按钮是其程序界面的一部分,而不是您的网站。

在您的特定情况下,我认为最好的选择是在页面上添加一个卸载事件,以警告用户是否尚未填写表单。后退按钮将不受影响,并且将警告用户其操作。


不,你注定了。即使您在其他浏览器中弹出页面并隐藏"后退"按钮,也始终会有Backspace键。

营销人员和分析师类型的问题在于,其中一些人不了解网络无状态的基本概念。他们不了解该页面是完全,完全不知道使用该页面的浏览器,并且对浏览器的绝对控制完全超出了网页的功能。

劝阻用户单击"后退"按钮的最佳方法是确保用户按回时您的页面丢失所有数据,例如,注释页面是可以保存数据的唯一点,并且请确实按下返回按钮,他们必须重新做一遍所有事情(考虑实用性:nocache)。

用户肯定会抱怨,但这是存在被抛弃的要求的原因,对吗?


我想出了一个小技巧,可以使用JavaScript禁用后退按钮。我在chrome 10,firefox 3.6和IE9上进行了检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!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">
Untitled Page
<script type ="text/javascript">
function changeHashOnLoad() {
     window.location.href +="#";
     setTimeout("changeHashAgain()","50");
}

function changeHashAgain() {
  window.location.href +="1";
}
// If you want to skip the auto-positioning at the top of browser window,you can add the below code:
window.location.hash=' ';
var storedHash = window.location.hash;
window.setInterval(function () {
    if (window.location.hash != storedHash) {
         window.location.hash = storedHash;
    }
}, 50);



</head>
<body onloadx="changeHashOnLoad();">
Try to hit the back button!
</body>
</html>

我以前见过:

1
window.onBack = history.forward();

这绝对是一个肮脏的hack,如果可能的话,我将尝试不禁用后退按钮。用户可能仍然可以很轻松地解决它。而且,根据缓存的不同,也无法确定是否将处理服务器代码,或者是否将首先运行带有JavaScript的缓存页面。

所以,是的,使用风险自负:)


您可以访问服务器端的源代码吗?如果是这样,您可以在首页上进行检查,如果信息已经提交,则可以重定向到第二页(显然,您需要使用会话)。在以前的工作中,这就是我们处理多步骤申请(如接受申请中的申请)的方式。


What the users have figured out is
that they don't have to enter a
comment if they submit the information
and go to the page with the comment
and then hit the back button to return
to the previous page.

这时,他们可能也足够聪明,可以在评论字段中输入\\'no comment \\'。

您可以尝试强迫人们添加评论,但是您最终可能会得到糟糕的无法使用的软件,使用户烦恼并且仍然无法获得评论。通常,这是退后一步并从用户的angular重新考虑您正在做的事情的好时机。


由于浏览器中javascript的安全隔离,因此您无法更改后退按钮的功能。

也许您可以在用户的??会话中存储一些内容,以表明需要注释,并且应用程序中有任何页面供用户尝试将其重定向到注释页面?

如果用户在看到评论页面时关闭浏览器怎么办?

我知道您在这里没有选择的余地,但是鉴于他们的要求似乎是不可能的...

在用户输入评论之前,您可能只是认为项目未完成。因此,您需要同时跟踪进行中的项目和已完成的项目,并在UI中进行区分,但这可能是最可靠的方法。

还是仅将评论字段放在表单页面上?


您可以将注释移到上一页并将其设置为必填字段吗?

禁用后退按钮将不起作用。


您应该保护应用程序免受双重提交的侵害,而不是破坏用户界面以隐藏该错误。


禁用后退按钮似乎是一种"强力"方法。

另一种选择是,您可以跳到不带命令按钮的模式对话框,引导用户完成工作流程,并在过程完成后关闭对话框。


我看不到此解决方案:

1
2
3
4
5
function removeBack(){
\twindow.location.hash="nbb";
\twindow.location.hash="";
\twindow.onhashchange=function(){window.location.hash="";}
}


如果要从头开始新的Web应用程序,或者有足够的时间来重做应用程序,则可以使用JavaScript和AJAX来避免浏览器的历史记录,后退和前进功能。

  • 登录前或登录后立即在新窗口中打开您的应用程序。
  • 如果需要,可以使用窗口选项隐藏导航栏(使用后退和前进按钮)。
  • 将AJAX用于所有服务器请求,而无需更改窗口的位置URL。
  • 使用简单的Web API获取数据并执行操作,并使用JavaScript呈现应用。
  • 窗口的历史记录中只有一个URL。
  • 后退和前进按钮将无效。
  • 注销后可以自动关闭窗口。
  • 没有信息泄露到浏览器历史记录中,这可以帮助提高安全性。

该技术回答了这个问题,但它在几个方面也与最佳实践相矛盾:

  • 后退和前进按钮的行为应与预期的一样。
  • 应用程序不应打开新的浏览器窗口。
  • 没有JavaScript的应用仍然可以正常运行。

在使用此技术之前,请仔细考虑您的要求和您的用户。


您可以防止它们返回上一页。 location.replace()用新页面替换当前页面的历史记录条目,因此...

page1.html:用户单击一个链接,该链接转到page2.html

page2.html:用户单击一个调用location.replace('page3.html');

的链接

page3.html:用户单击后退按钮并转到page1.html

这可能不适合进行POST,但是您可以通过AJAX将数据发布到Web服务,然后调用location.replace()


作为一种简单的解决方案:试试这个。在其中插入一个更新面板和一个按钮,并使用javascript隐藏它,然后在页面加载时按它。是的,我了解这会导致您的页面重新加载,并且如果禁用了javascript可能无法正常工作,但是可以肯定地帮助您对后退按钮问题做出半个体面的响应。安迪


根本没有可靠的方法可以做到这一点。您不能保证有100%的时间可以阻止用户执行此操作。

考虑到这一点,是否有必要采用极具异国情调的解决方案来禁用"大多数"时间?这由您决定。

祝你好运。


推荐阅读