我已经编写了以下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的代码?
由于
答案 0 :(得分:11)
切勿尝试任何妨碍用户使用浏览器正常操作的内容。即使您使用javascript执行此操作,他也可以禁用该脚本,然后继续刷新页面。
如果您需要阻止在刷新时执行的操作,请在服务器端处理它。
答案 1 :(得分:6)
您似乎试图阻止用户执行您的代码无法轻松处理的内容,例如通过点击刷新来停止他们“购买商品X”两次,或者通过按住F5惹恼你来经常点击你的网站。
如果您要阻止滥用,我建议使用其他解决方案,例如Cookie /状态管理或阻止客户端IP。
答案 2 :(得分:6)
对于那些说“不要这样做”的人:你没有帮助。总是有一个必须打破经验法则的副案例。
例如,我正在使用的客户端有一个系统,其测试应用程序的主要部分是由第二个浏览器窗口构建的,该窗口全屏显示,没有工具栏,书签或任何其他窗口选项,以及禁用所有不受测试环境直接影响的密钥。在这种情况下,对于可能具有低技术技能的用户来说,能够参加测试而不会无意中击中F5并重新加载大量的客户端问题以及之前的所有答案都被删除是很有价值的。问题是客户端问题,因为预加载允许测试在低带宽连接上运行,就像在第三世界中发现的那样。
从我所知道的这个仅限Safari的问题(Chrome,另一个基于Webkit的浏览器,没有这个问题),即使是警告框也不会让浏览器无法刷新。警报显示,然后页面正常刷新。
我尝试过的任何东西似乎都没有阻止关键。我已经读过,这被认为是Safari的一个缺陷,并且某个版本号的Safari应该包含一个修复程序,但是当我写这篇文章时,这在最新版本的Safari中尚未实现视窗。我已经在Mac上对此进行了测试,似乎已在该平台上进行了修复。
答案 3 :(得分:4)
+1给其他人说“不要这样做”。这根本不可行。还有许多其他刷新页面的方法...至少在我的浏览器上:工具栏按钮*; CTRL-R;右键单击重装; ctrl-T获取标签栏然后右键单击-tab-reload;等等。告诉你的客户这是不可能的,并继续实际有用的东西。
*:我的浏览器也不允许尝试隐藏浏览器镶边,因为这是一个非常糟糕的主意。您可以通过忽略告诉用户他们确实在您网站上的基本指标来打开网络钓鱼攻击。
答案 4 :(得分:0)
是的,它似乎是Safari 4 Windows的一个错误。你也不能停止CTRL + F.
然而,打开警报会阻止它,但这是一个粗略的权衡。
答案 5 :(得分:-1)
我有一个处理F5的逻辑,类似于问题。我正在显示一个确认框,询问"您输入的数据可能无法保存?"。如果用户点击好的,页面应该重新加载,如果点击取消,页面需要保留原样。但仅限于徒步旅行" 取消"点击还可以重新加载页面。我在Safari 5.1.7中进行了测试。