我已经编写了以下javascript代码来捕捉F5键按下并阻止用户刷新:(
我知道这不是一个好主意,但无论是否有人喜欢它我都坚持这个.我问的问题也与为什么有关下面的脚本不适用于safari 4,但适用于其他浏览器.)
var fn = function (e) { if (!e) var e = window.event; var keycode = e.keyCode; if (e.which) keycode = e.which; var src = e.srcElement; if (e.target) src = e.target; // 116 = F5 if (116 == keycode) { // Firefox and other non IE browsers if (e.preventDefault) { e.preventDefault(); e.stopPropagation(); } // Internet Explorer else if (e.keyCode) { e.keyCode = 0; e.returnValue = false; e.cancelBubble = true; } return false; } } // Assign function to onkeydown event document.onkeydown = fn;
上面的代码适用于IE 6,7和8,从Firefox 2.0开始以及在Chrome中.但是它不适用于Safari 4 for Windows.按F5键刷新文档.有趣的是,在Safari中代码进入上面的if(e.preventDefault)部分但由于某种原因它不会阻止默认操作,即刷新页面.
这是Safari 4的错误还是我需要编写一些特定于Safari的代码?
谢谢
切勿尝试任何妨碍用户使用浏览器进行正常操作的操作.即使您使用javascript执行此操作,他也可以禁用该脚本,然后继续页面刷新.
如果您需要阻止在刷新时执行的操作,请在服务器端处理它.
看起来你试图阻止用户做一些你的代码无法轻松处理的事情,比如通过点击刷新来停止他们"购买项目X"两次,或者通过按住F5来惹恼你,经常点击你的网站.
如果您要防止滥用,我建议其他解决方案,如Cookie /状态管理或阻止客户端IP.
对于那些说"不要这样做"的人:你没有帮助.总是存在必须打破经验法则的侧面案例.
例如,我正在使用的客户端有一个系统,其测试应用程序的主要部分是由第二个浏览器窗口构建的,该窗口全屏显示,没有工具栏,书签或任何其他窗口选项,并禁用所有键不受测试环境直接影响的.在这种情况下,对于可能具有低技术技能的用户而言,能够在不会无意中击中F5并重新加载大量的客户端问题系列并且其所有先前的答案被删除的情况下,对于该用户来说是有价值的.问题是客户端问题,因为预加载允许测试在低带宽连接上运行,就像在第三世界中发现的那样.
从我所知道的这个仅限Safari的问题(Chrome,另一个基于Webkit的浏览器,没有这个问题),即使是警告框也不会让浏览器无法刷新.警报显示,然后页面正常刷新.
我尝试过的任何东西似乎都没有阻止关键.我已经读过,这被认为是Safari的一个缺陷,并且某个版本号的Safari应该包含一个修复程序,但是当我写这篇文章时,这还没有在最新版本的Safari中实现视窗.我在Mac上测试了这个,它似乎在那个平台上修复了.