如何使用 JavaScript 停止浏览器后退按钮?

IT技术 javascript browser
2021-01-26 08:06:50

我正在用 PHP 做一个在线测验应用程序。我想限制用户返回考试。

我尝试了以下脚本,但它停止了我的计时器。

我该怎么办?

计时器存储在文件cdtimer.js 中

<script type="text/javascript">
    window.history.forward();
    function noBack()
    {
        window.history.forward();
    }
</script>

<body onLoad="noBack();" onpageshow="if (event.persisted) noBack();" onUnload="">

我有一个考试计时器,它从 MySQL 值中获取考试的持续时间。计时器相应地启动,但是当我输入禁用后退按钮的代码时它会停止。我的问题是什么?

6个回答

禁用后退按钮不起作用的原因有很多。最好的办法是警告用户:

window.onbeforeunload = function() { return "Your work will be lost."; };

此页面确实列出了许多您可以尝试禁用后退按钮的方法,但不能保证:

http://www.irt.org/script/311.htm

如果答案已经提交,您应该检查您的 PHP 代码,如果已经提交,则拒绝它。
2021-03-12 08:06:50
值得一提的是,现代浏览器的情况已经发生了变化:请参阅stackoverflow.com/questions/19926641/...
2021-03-24 08:06:50
它可以工作,但是,这也显示了所有菜单按钮上的警报。当它要更改页面时,它会显示警报。我们可以只将它修复到后退按钮吗
2021-04-09 08:06:50

覆盖网络浏览器的默认行为通常是一个坏主意。出于安全原因,客户端脚本没有足够的权限来执行此操作。

也有人问过类似的问题,

实际上无法禁用浏览器后退按钮。但是,您可以使用您的逻辑来阻止用户导航回来,这会产生一种像被禁用的印象。这是如何 - 查看以下代码段。

(function (global) {

    if(typeof (global) === "undefined") {
        throw new Error("window is undefined");
    }

    var _hash = "!";
    var noBackPlease = function () {
        global.location.href += "#";

        // Making sure we have the fruit available for juice (^__^)
        global.setTimeout(function () {
            global.location.href += "!";
        }, 50);
    };

    global.onhashchange = function () {
        if (global.location.hash !== _hash) {
            global.location.hash = _hash;
        }
    };

    global.onload = function () {
        noBackPlease();

        // Disables backspace on page except on input fields and textarea..
        document.body.onkeydown = function (e) {
            var elm = e.target.nodeName.toLowerCase();
            if (e.which === 8 && (elm !== 'input' && elm  !== 'textarea')) {
                e.preventDefault();
            }
            // Stopping the event bubbling up the DOM tree...
            e.stopPropagation();
        };
    }
})(window);

这是在纯 JavaScript 中编写的,因此可以在大多数浏览器中使用。它还会禁用退格键,但该键将在input字段和textarea.

推荐设置:

将此代码段放在单独的脚本中,并将其包含在您想要此行为的页面上。在当前设置中,它将执行onloadDOM 事件,这是此代码的理想入口点。

工作演示!

它在以下浏览器中进行了测试和验证,

  • 铬合金。
  • 火狐。
  • Internet Explorer (8-11) 和 Edge。
  • 苹果浏览器。
阻止 ipad air、ios 8 上的后退按钮
2021-03-12 08:06:50
是的,它会起作用,但是如果我必须从内存中回忆一些东西,当我一开始有这个的时候......流程在 chrome 中无法像在其他浏览器中那样正常工作。Chromelocation.hash最初返回了空的,所以它让我这样做。对此可能会有更多改进,但仅一次 50 毫秒并没有花费我太多,所以我将其留在那里。
2021-03-21 08:06:50
我不明白为什么 setTimeout。如果我最初只是附加 #! 定位并删除setTimeout,它仍然有效。
2021-03-24 08:06:50
哦,这是一个内存挑战,谢谢:) 我使用了你的解决方案,但用 .onhashchange 处理程序替换了 setInterval 。完美运行。但我还有另一个问题:为什么要“if (global.location.hash != _hash)”?我认为这种情况只能一直成立,因为 window.location.hash 应该始终返回带有“#”字符的哈希值,而 _hash 永远不会包含“#”字符。你还记得什么吗?这只是一种保护,以防浏览器不返回 location.hash 中的“#”字符?
2021-03-25 08:06:50
我按照建议创建了一个 .js 文件,并使用以下代码将 js 文件包含在我的代码中:<script src="./javascript/noback.js"></script> 但我仍然可以执行返回(使用 Safari)。我错过了什么?这个库的添加方式与我使用的其他库相同,所以包含很好。
2021-04-09 08:06:50

我遇到了这个问题,需要一个在各种浏览器(包括 Mobile Safari(发布时为 iOS 9)上都能正常运行且“很好”)的解决方案没有一个解决方案是完全正确的。我提供以下内容(在 Internet Explorer 11、Firefox、Chrome 和 Safari 上测试):

history.pushState(null, document.title, location.href);
window.addEventListener('popstate', function (event)
{
  history.pushState(null, document.title, location.href);
});

请注意以下事项:

  • history.forward()(我的旧解决方案)在 Mobile Safari 上不起作用 --- 它似乎什么都不做(即,用户仍然可以返回)。history.pushState()确实适用于所有这些。
  • 第三个参数history.pushState()是一个url传递类似'no-back-button''pagename'似乎工作正常的字符串的解决方案,直到您尝试在页面上刷新/重新加载,此时当浏览器尝试使用该页面作为其 URL 定位页面时,会生成“找不到页面”错误。(浏览器也可能在页面上的地址栏中包含该字符串,这很丑陋。)location.href应该用于 URL。
  • 的第二个参数history.pushState()标题环顾网络,大多数地方都说它“未使用”,这里的所有解决方案都是null如此。但是,至少在 Mobile Safari 中,这会将页面的 URL 放入用户可以访问的历史记录下拉列表中。但是当它正常为页面访问添加条目时,它会放入其title,这是可取的。因此,通过document.title它会导致相同的行为。
在jsp sevlet 提交后刷新页面。页面不显示(错误)
2021-03-11 08:06:50
这应该是公认的答案,它是跨平台的,而且工作正常。
2021-03-13 08:06:50
在 Chrome 79.0.3945.130 中,这对我不起作用。我完全按照上面的方式实现,我可以通过单击“后退”按钮返回。当我按住后退按钮并选择历史记录中的任何项目时,我确实被阻止了。但是快速单击“后退”按钮会立即返回上一页。
2021-04-02 08:06:50
这是正确答案。在 Chrome、IE 11、Firefox 和 Edge 上完美运行。
2021-04-06 08:06:50
现代浏览器的完美解决方案。我已经结合@Rohit416 答案来支持旧浏览器,只需使用条件 typeof (history.pushState) === "function" 工作顺利。
2021-04-08 08:06:50
<script>
    window.location.hash = "no-back-button";

    // Again because Google Chrome doesn't insert
    // the first hash into the history
    window.location.hash = "Again-No-back-button"; 

    window.onhashchange = function(){
        window.location.hash = "no-back-button";
    }
</script>
天才!我使用它来防止当用户在 Web 应用程序中点击 Backspace(例如在禁用/只读字段上)时意外触发后退按钮,而后退/前进无论如何都没有意义。Confirmed 禁用后退和前进功能(不是按钮本身),包括上下文菜单选项;在 IE8 到 IE11、Chrome 和 FF 中验证。
2021-03-13 08:06:50
这对我不起作用。我在 Windows 10 上使用 Chrome 版本 55。我将脚本放在几个地方(标题的开头、正文的结尾等),我仍然可以使用后退按钮返回上一页。
2021-03-13 08:06:50
它在 Firefox 上对我有用,但在 chrome 上不起作用(版本 36.0.1985.143)
2021-03-27 08:06:50
这对我也window.history.back()有用,但在 Firefox 上它似乎破坏了该功能。我们希望防止用户点击浏览器的后退按钮,但在某些情况下,我们会在页面上提供我们自己的后退按钮。有没有办法让它工作?
2021-03-28 08:06:50
这有效,但会重置在文本框中输入的所有数据。是否可以防止清除?
2021-04-09 08:06:50

用于限制浏览器返回事件:

window.history.pushState(null, "", window.location.href);
window.onpopstate = function () {
    window.history.pushState(null, "", window.location.href);
};
我刚刚在以下浏览器上使用 Windows 10 操作系统对其进行了测试(效果很好)Chrome 版本 74.0.3729.108(官方版本)(64 位)Chrome Canary 版本 76.0.3780.0(官方版本)canary(32 位)Chromium 版本 66.0。 3355.0(开发者版本)(64 位)Firefox 66.0.3(64 位)EDGE IE 11 Safari 5.1.7
2021-03-16 08:06:50
@TarıkSeyceri 因为这只适用于 a) 支持历史 API b) 页面实际上使用历史 API 来管理状态的浏览器
2021-03-18 08:06:50
这在 chrome 上效果很好!,为什么人们不投票,因为这是最好的答案?
2021-03-23 08:06:50
在 75 版之后不再在 Chrome 中工作。请参阅:support.google.com/chrome/thread/8721521?hl=en
2021-03-31 08:06:50