使用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,会发生一些事情。
- 当单击locking时,用户会话数据有一个名为“locking”的variables,变为TRUE
- 当刷新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)">