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

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

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

什么是最好的办法呢?

更新最近的一条评论声称这不适用于新的Chrome浏览器…如jsFiddle所示,并在我的个人网站上testing,这种方法仍然适用于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); 

在旁注:这只会禁用键盘上的f5button。 要真正禁用刷新,您必须使用服务器端脚本来检查页面状态更改。 不能说我真的知道如何做,因为我还没有做到这一点。

在我工作的软件网站上,我们将disableF5function与Codeigniter会话数据结合使用。 例如,有一个lockingbutton将locking屏幕并提示密码对话框。 “disableF5”function非常简单快捷,并且保持button不会做任何事情。 但是,要防止用鼠标点击刷新button,会发生一些事情。

  1. 当单击locking时,用户会话数据有一个名为“locking”的variables,变为TRUE
  2. 当刷新button被点击时,在母版页上加载方法是检查会话数据是否为“已locking”,如果为TRUE,那么我们简单地不允许redirect,并且页面永不改变,不pipe请求的目的地

提示:尝试使用服务器设置的cookie,例如PHP的$_SESSION ,甚至.Net的Response.Cookies ,来维护客户端在您的网站的“位置”。 这是我用CI的Session类做更多的Vanilla方法。 最大的区别是CI在你的数据库中使用了一个表,而这些香草方法在客户端存储一个可编辑的cookie。 不过,缺点是用户可以清除它的cookies。

来自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; } } 

对于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); }); 
 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).bind('beforeunload', function(e) { return "Unloading this page may lose data. What do you want to do..." e.preventDefault(); }); 

这是我用来禁用IE和Firefox的刷新的代码(这适用于F5,Ctr + F5和Ctrl + R)

 <script language="javascript" type="text/javascript"> //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"; } } } </script> 

如果您不想使用useragent来检测它是哪种types的浏览器($ .browser使用navigator.userAgent来确定平台),则可以使用

if('MozBoxSizing' in document.documentElement.style) – 为firefox返回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; } } } 

用于现代浏览器:

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

如果您使用的是JSF,则可以直接使用丰富的面部热键。

 <rich:hotKey key="backspace" onkeydown="if (event.keyCode == 8) return false;" handler="return false;" disableInInput="true" /> <rich:hotKey key="f5" onkeydown="if (event.keyCode == 116) return false;" handler="return false;" disableInInput="true" /> <rich:hotKey key="ctrl+R" onkeydown="if (event.keyCode == 123) return false;" handler="return false;" disableInInput="true" /> <rich:hotKey key="ctrl+f5" onkeydown="if (event.keyCode == 154) return false;" handler="return false;" disableInInput="true" /> 

如果你想禁用Ctrl + F5,Ctrl + R,F5,退格键,那么你可以使用这个简单的代码。 此代码在Mozila以及Chrome中都有效。 把这个代码添加到你的body标签中:

 <body onkeydown="return (event.keyCode == 154)">