使用 JavaScript 禁用 F5 和浏览器刷新

IT技术 javascript dom-events
2021-01-29 14:39:49

我想使用 JavaScript 禁用浏览器刷新。

目前,我正在使用window.onbeforeunload并且不希望在用户刷新浏览器时调用它。

最好的方法是什么?

6个回答

更新最近的评论声称这在新的 Chrome 中不起作用......如 jsFiddle 所示,并在我的个人网站上进行了测试,此方法从 Chrome 版本开始仍然有效26.0.1410.64 m

顺便说一下,这在 jQuery 中非常简单:

js小提琴

// slight update to account for browsers not supporting e.which
function disableF5(e) { if ((e.which || e.keyCode) == 116) e.preventDefault(); };
// To disable f5
    /* jQuery < 1.7 */
$(document).bind("keydown", disableF5);
/* OR jQuery >= 1.7 */
$(document).on("keydown", disableF5);

// To re-enable f5
    /* jQuery < 1.7 */
$(document).unbind("keydown", disableF5);
/* OR jQuery >= 1.7 */
$(document).off("keydown", disableF5);

附带说明:这只会禁用键盘上的 f5 按钮。要真正禁用刷新,您必须使用服务器端脚本来检查页面状态更改。不能说我真的知道该怎么做,因为我还没有这样做。

在我工作的软件站点上,我们将 disableF5 函数与 Codeigniter 的会话数据结合使用。例如,有一个锁定按钮可以锁定屏幕并提示密码对话框。功能“disableF5”既快速又简单,可防止该按钮执行任何操作。然而,为了防止鼠标点击刷新按钮,会发生一些事情。

  1. 单击锁定时,用户会话数据有一个名为“已锁定”的变量,该变量变为 TRUE
  2. 单击刷新按钮时,在母版页面加载方法上检查会话数据是否为“锁定”,如果为 TRUE,则我们简单地不允许重定向并且页面永远不会更改,无论请求的目的地如何

提示:尝试使用服务器设置的 cookie,例如 PHP 的$_SESSION,甚至 .Net 的Response.Cookies,来维护您的客户端在您的站点中的“位置”。这是比较香草办法做我与CI的Session类做。最大的不同之处在于CI使用表中您的数据库,而这些香草方法保存在客户端可编辑的cookie。但缺点是用户可以清除其 cookie。

@alem0lars 经过大量测试后,我发现此功能在 Chrome 中仍然可以正常工作。也许我们可以看到您的其他一些代码?在此处查看 Chrome 中的工作示例正如您所看到的,它运行良好,您的反对票真的没有必要。
2021-03-16 14:39:49
这真的很酷,但我有一个问题。Ctrl+Shift+R用于硬重新加载,类似地Ctrl+RF5用于正常重新加载。我已经看到一些网站在长按重新加载按钮后提供了执行所有这些操作的选项是的,我们可以阻止这些键,但是我们如何阻止该菜单弹出特定站点/页面?
2021-03-19 14:39:49
你好,亲爱的,你的代码真的很棒,我在我的一个页面中尝试过,它禁用了我在该页面上的所有控件的所有自动回发。之后,我删除了这些代码行。但自动回发未启用。我重新启动我的机器清除所有浏览器历史记录,但根本没有启用自动回发。这背后的原因是什么。请指导我。
2021-04-01 14:39:49
您可能还想为 Ctrl+F5 和 Ctrl+R 添加案例。此外,大多数浏览器允许从上下文菜单刷新。除了一起禁用上下文菜单之外,您在这里无能为力,这在大多数情况下是需要避免的。
2021-04-02 14:39:49
当然,这根本不会禁用刷新。如果文档有焦点,它只会阻止 F5 键。说“这在 jQuery 中真的很容易”充其量是虚伪的。
2021-04-05 14:39:49
var ctrlKeyDown = false;

$(document).ready(function(){    
    $(document).on("keydown", keydown);
    $(document).on("keyup", keyup);
});

function keydown(e) { 

    if ((e.which || e.keyCode) == 116 || ((e.which || e.keyCode) == 82 && ctrlKeyDown)) {
        // Pressing F5 or Ctrl+R
        e.preventDefault();
    } else if ((e.which || e.keyCode) == 17) {
        // Pressing  only Ctrl
        ctrlKeyDown = true;
    }
};

function keyup(e){
    // Key up Ctrl
    if ((e.which || e.keyCode) == 17) 
        ctrlKeyDown = false;
};

从恩里克网站上发布:

window.history.forward(1);
document.attachEvent("onkeydown", my_onkeydown_handler);
function my_onkeydown_handler() {
    switch (event.keyCode) {
        case 116 : // 'F5'
            event.returnValue = false;
            event.keyCode = 0;
            window.status = "We have disabled F5";
            break;
    }
}
请记住,这不会禁用Back Button. 第 1 行 [ window.history.forward(1);] 旨在放在您不希望用户访问的每个页面back上。简而言之,如果用户回击,他们将被重定向到原来的位置。这实际上仅适用于linear sequence页面,例如银行登录。其余的只是我在回答中提到的 jQuery 方法的 Vanilla JS。大多数地方已经用服务器端重定向或类似 Node.JS 的东西替换了第一行,它允许实时调用,比如套接字,保持用户正在做什么的恒定标签容易多了
2021-03-13 14:39:49

mac cmd+r, cmd+shift+r 需要。

function disableF5(e) { if ((e.which || e.keyCode) == 116 || (e.which || e.keyCode) == 82) e.preventDefault(); };

$(document).ready(function(){
$(document).on("keydown", disableF5);
});
这将禁用键 'r'
2021-03-23 14:39:49
(e.which || e.keyCode) == 82)r仅在 Mac 上单独按下时也是如此因此,如果您有一个文本框,您将无法输入r.
2021-04-10 14:39:49

将此用于现代浏览器:

function my_onkeydown_handler( event ) {
    switch (event.keyCode) {
        case 116 : // 'F5'
            event.preventDefault();
            event.keyCode = 0;
            window.status = "F5 disabled";
            break;
    }
}
document.addEventListener("keydown", my_onkeydown_handler);