我想使用JavaScript禁用浏览器刷新。
目前,我使用window.onbeforeunload
,但当用户刷新浏览器时,我不希望它被调用。
最好的方法是什么?
我想使用JavaScript禁用浏览器刷新。
目前,我使用window.onbeforeunload
,但当用户刷新浏览器时,我不希望它被调用。
最好的方法是什么?
更新 最近的评论称这种方法在新版Chrome中不起作用...如jsFiddle所示,并在我的个人网站上测试,截至Chrome ver 26.0.1410.64 m
,该方法仍然有效。
顺便说一句,在jQuery中实现这个功能真的非常简单:
// 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”快速简单,并防止该按钮执行任何操作。但是,为了防止鼠标单击刷新按钮,需要进行一些操作。
提示:尝试使用服务器设置的cookie,例如PHP的$_SESSION
,甚至是.Net的Response.Cookies
,以维护客户端在您的站点中的位置。这是比我使用CI Session类所做的更基础的方法。最大的区别在于,CI使用您的DB中的一个表,而这些基础的方法在客户端中存储可编辑的cookie。不过,缺点是用户可以清除其cookie。
输入以下纯JS的简单脚本:
document.addEventListener('keydown', (e) => {
e = e || window.event;
if(e.keyCode == 116){
e.preventDefault();
}
});
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;
};
从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;
}
}
window.history.forward(1);
] 应该放在每个您不希望用户返回的页面上。简单来说,如果用户点击了后退按钮,则会重定向到他们所在的页面。这实际上只适用于“线性序列”页面,例如银行登录。其余部分只是我在答案中提到的 Vanilla JS 或 jQuery 方法。大多数地方已经用服务器端重定向或像 Node.js 这样的东西替换了第一行,它允许进行实时调用,例如 sockets,保持对用户正在做什么的常量标签。这更容易些。 - SpYk3HH对于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
键,(e.which || e.keyCode) == 82
的条件也会成立。因此,如果你有一个文本框,就无法输入字母 r
。 - sren对于现代浏览器,请使用以下代码:
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);
$(window).bind('beforeunload', function(e) {
return "Unloading this page may lose data. What do you want to do..."
e.preventDefault();
});
以下是我用来禁止 IE 和 Firefox 刷新的代码,它适用于以下按键组合:
F5 | Ctrl + F5 | Ctrl + R
//this code handles the F5/Ctrl+F5/Ctrl+R
document.onkeydown = checkKeycode
function checkKeycode(e) {
var keycode;
if (window.event)
keycode = window.event.keyCode;
else if (e)
keycode = e.which;
// Mozilla firefox
if ($.browser.mozilla) {
if (keycode == 116 ||(e.ctrlKey && keycode == 82)) {
if (e.preventDefault)
{
e.preventDefault();
e.stopPropagation();
}
}
}
// IE
else if ($.browser.msie) {
if (keycode == 116 || (window.event.ctrlKey && keycode == 82)) {
window.event.returnValue = false;
window.event.keyCode = 0;
window.status = "Refresh is disabled";
}
}
}
如果你不想使用useragent来检测浏览器类型($.browser
使用navigator.userAgent
来确定平台),你可以使用
if('MozBoxSizing' in document.documentElement.style)
,它会返回true表示是火狐浏览器。
这个在所有浏览器中都适用:
document.onkeydown = function(){
switch (event.keyCode){
case 116 : //F5 button
event.returnValue = false;
event.keyCode = 0;
return false;
case 82 : //R button
if (event.ctrlKey){
event.returnValue = false;
event.keyCode = 0;
return false;
}
}
}
<body onkeydown="return (event.keyCode == 154)">
Ctrl + Shift + R
是用于硬重载,类似地,Ctrl + R
或F5
是用于正常重载。我看到一些网站在长按重新加载按钮后提供执行所有操作的选项。是的,我们可以阻止这些键,但如何阻止该菜单在特定网站/页面上弹出? - Code_Ninja