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

Sal*_*lil 57 javascript javascript-events

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

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

最好的方法是什么?

SpY*_*3HH 83

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

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

的jsfiddle

// 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);
Run Code Online (Sandbox Code Playgroud)

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

在我工作的软件站点上,我们将disableF5函数与Codeigniter的会话数据结合使用.例如,有一个锁定按钮,它将锁定屏幕并提示密码对话框.功能"disableF5"快速简便,并使该按钮不做任何事情.但是,为了防止鼠标单击刷新按钮,会发生一些事情.

  1. 单击锁定时,用户会话数据具有名为"已锁定"的变量,该变量变为TRUE
  2. 单击刷新按钮时,在主页面上加载方法是对"已锁定"的会话数据进行检查,如果为TRUE,那么我们很简单,不允许重定向,页面永远不会更改,无论请求的目标是什么

提示:尝试使用服务器设置的cookie(例如PHP$_SESSION或甚至.Net)Response.Cookies来维护客户端在您网站中的"位置".这是我用CI的Session类做的更多 Vanilla方式.最大的区别是CI在您的数据库中使用表,而这些 vanilla方法在客户端中存储可编辑的cookie.不利的一面是,用户可以清除其cookie.

  • @ alem0lars经过大量测试,我发现这个功能在Chrome中仍能正常使用.也许我们可以看到你的其他一些代码?[请参阅Chrome HERE中的工作示例](http://jsfiddle.net/SpYk3/C85Hs/).你可以看到它工作正常,你的唐投票真的没必要. (2认同)

Gia*_*dei 11

在纯 JS 中输入这个简单的脚本:

document.addEventListener('keydown', (e) => {
    e = e || window.event;
    if(e.keyCode == 116){
        e.preventDefault();
    }
});
Run Code Online (Sandbox Code Playgroud)


kzh*_*kzh 8

来自网站Enrique发布:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


gok*_*han 8

对于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);
});
Run Code Online (Sandbox Code Playgroud)

  • `(e.which || e.keyCode)== 82)`在Mac上单独按`r`时也是如此.因此,如果你有一个文本框,你将无法输入`r`. (5认同)
  • 这将禁用键 'r' (3认同)

小智 8

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;
};
Run Code Online (Sandbox Code Playgroud)


Orh*_*ral 6

将此用于现代浏览器:

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);
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我用来禁用 IE 和 Firefox 刷新的代码,适用于以下组合键:

\n

F5\xc2\xa0\xc2\xa0|\xc2\xa0\xc2\xa0\n Ctrl+ F5\xc2\xa0\xc2\xa0|\xc2\xa0\xc2\xa0\n Ctrl+R

\n
//this code handles the F5/Ctrl+F5/Ctrl+R\ndocument.onkeydown = checkKeycode\nfunction checkKeycode(e) {\n    var keycode;\n    if (window.event)\n        keycode = window.event.keyCode;\n    else if (e)\n        keycode = e.which;\n                \n    // Mozilla firefox\n    if ($.browser.mozilla) {\n        if (keycode == 116 ||(e.ctrlKey && keycode == 82)) {\n            if (e.preventDefault)\n            {\n                e.preventDefault();\n                e.stopPropagation();\n            }\n        }\n    } \n    // IE\n    else if ($.browser.msie) {\n        if (keycode == 116 || (window.event.ctrlKey && keycode == 82)) {\n            window.event.returnValue = false;\n            window.event.keyCode = 0;\n            window.status = "Refresh is disabled";\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果您不想使用 useragent 来检测它是什么类型的浏览器($.browser用于navigator.userAgent确定平台),您可以使用

\n

if(\'MozBoxSizing\' in document.documentElement.style)对于 Firefox 返回 true

\n


Hla*_*Swe 5

$(window).bind('beforeunload', function(e) { 
    return "Unloading this page may lose data. What do you want to do..."
    e.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

  • 这不是事件有意义.返回点后有无法访问的代码. (5认同)