【问题标题】:Disable F5 key in Safari 4在 Safari 4 中禁用 F5 键
【发布时间】:2010-12-02 07:13:36
【问题描述】:

我编写了以下 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。

但它不适用于 Windows 版 Safari 4。按 F5 键刷新文档。有趣的是,在 Safari 中,代码进入了上面的 if (e.preventDefault) 部分,但由于某种原因,它并没有阻止默认操作,即刷新页面。

这是 Safari 4 的错误还是我需要编写一些 Safari 特定的代码?

【问题讨论】:

  • 为什么?我可以简单地按下重新加载图标并获得您想要阻止的效果。任何正常的浏览器都不会让您对其工作进行如此程度的控制,您不应该尝试这样做!
  • 同意。这闻起来很像那些最好被遗忘的右键点击拦截器……修复你的网站,这样刷新就不会破坏它,而不是试图让众多浏览器为你出价。
  • 你是不是也屏蔽了ctrl-r?至少在 Firefox 中也会刷新。我可以想象其他浏览器有自己的自定义刷新按钮。这不是一件可行的事情。
  • 这是不可能的功能。一方面,我配置了我的浏览器(Opera),因此 JS 无法隐藏工具栏或地址栏,因为我绝对鄙视试图这样做的网站。
  • '功能'意味着有用。除了“我的客户告诉我这样做”(除了最坏的情况之外,这在所有情况下都是有效的,这是)之外,我看不到它的用处

标签: javascript safari dom-events


【解决方案1】:

切勿尝试任何妨碍用户正常使用浏览器的操作。即使您使用 javascript 执行此操作,他也可以禁用脚本,然后继续刷新页面。

如果您需要阻止刷新操作,请在服务器端进行处理。

【讨论】:

  • 这说得很好,我原则上同意,但有时你别无选择。例如,在我正在处理的情况下,我正在处理供应商提供的代码。我可以访问 JSP,但没有其他权限,而且我的雇主目前使用的是旧版本,因此无法让供应商更改代码(此外,供应商迟钝,可能无论如何也无法修复它)。同时,我有一个支持问题,需要我为用户禁用刷新。我的大多数用户甚至都不知道如何关闭 JS。
【解决方案2】:

您似乎试图阻止用户执行您的代码无法轻松处理的事情,例如通过点击刷新来阻止他们“购买商品 X”两次,或者通过按住 F5 来打扰您来阻止他们过于频繁地访问您的网站。

如果您要防止滥用,我会建议其他解决方案,例如 cookie/状态管理或阻止客户端 IP。

【讨论】:

    【解决方案3】:

    对于那些说“不要这样做”的人:你没有帮助。总是有一个必须打破经验法则的情况。

    例如,我正在使用的客户端有一个系统,其测试应用程序的主要部分是由第二个浏览器窗口构建的,该窗口全屏显示,没有工具栏、书签或任何其他窗口选项,并且禁用所有不受测试环境直接影响的键。在这种情况下,对于可能技术水平较低的用户来说,能够参加考试而不会无意中按 F5 并重新加载大量的客户端问题,而他们之前的所有答案都被删除,这对用户来说是很有价值的。这些问题是客户端的,因为预加载允许测试在低带宽连接上运行,就像在第三世界中发现的那样。

    据我所知,这个仅限于 Safari 的问题(Chrome,另一个基于 Webkit 的浏览器,没有这个问题),即使是警告框也不会阻止浏览器刷新。警报显示,然后页面正常刷新。

    我尝试过的任何方法似乎都无法阻止密钥。我已经读到这被认为是 Safari 的一个缺陷,并且 Safari 的某个内部版本应该包含一个修复程序,但是在我写这篇文章的时候,这还没有在 Safari 的最新版本中实现视窗。我已经在 Mac 上测试过了,它似乎在那个平台上是固定的。

    【讨论】:

      【解决方案4】:

      +1 对其他所有人说“不要这样做”。这根本不可行。还有许多其他刷新页面的方法......至少在我的浏览器上:工具栏按钮*; Ctrl-R;右键单击重新加载; ctrl-T 得到一个标签栏,然后右键单击-tab-reload;等等。告诉你的客户这是不可能的,然后继续做一些真正有用的事情。

      *:我的浏览器也不允许尝试隐藏浏览器 chrome,因为这是一个非常糟糕的主意。您忽略了告诉用户他们确实在您的网站上的基本指标,从而使自己容易受到网络钓鱼攻击。

      【讨论】:

        【解决方案5】:

        是的,这似乎是 Safari 4 Windows 的一个错误。你也不能停止 CTRL+F。

        但是,打开警报会阻止它,但这是一个粗略的权衡。

        【讨论】:

          【解决方案6】:

          我有一个逻辑来处理类似于问题的 F5。我正在显示一个确认框,询问“您输入的数据可能无法保存?”。如果用户单击 确定,页面应该重新加载,如果点击Cancel,页面需要保持原样。但只有在 safari 中的“Cancel”点击也重新加载页面。我在 Safari 5.1.7 中测试过。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-30
            • 1970-01-01
            • 1970-01-01
            • 2016-09-19
            • 1970-01-01
            • 2018-08-22
            相关资源
            最近更新 更多