【问题标题】:Is it possible to catch CTRL+W shortcut and prevent tab closing?是否可以捕获 CTRL+W 快捷方式并防止标签关闭?
【发布时间】:2014-02-11 07:29:29
【问题描述】:
$(window).on("keydown", function (e) {
    alert(e.keyCode);
});

W87 键码。我也知道e.ctrlKeytrue 如果在那一刻按下 Ctrl

是否可以捕获 Ctrl + W 键并防止标签关闭?

我试过了:

$(window).on("keydown", function (e) {
    if (e.keyCode === 87 && e.ctrlKey) {
        return false;
    }
});

但在这种情况下,浏览器快捷方式似乎具有优先权,并且选项卡已关闭。

我正在寻找解决方案:如果无法通过 JavaScript 实现,也许浏览器插件可以做到这一点。

【问题讨论】:

  • 也许是e.which 而不是e.keyCode
  • 我认为限制用户离开你的页面不是一个好的设计。
  • 我不能发表评论,抱歉)[阻止结束讨论][1][另一个讨论][2][1]:security.stackexchange.com/questions/46270/…[2]:stackoverflow.com/questions/3950981/…
  • @hjpotter92 这只是为了我:我在浏览器中运行一个终端,我经常按CTRL + W 删除最后一个单词,但选项卡已关闭......

标签: javascript jquery browser window


【解决方案1】:

这不是对原始提问者的回复,而是对通过搜索找到此问题的任何人的回复。这篇文章旨在为您提供返回给您的老板或客户所需的信息和论据,并告诉他们为什么无法实现此设计。此问题的最佳答案提供了 beforeunload 解决方案。祝他们好运!


这个项目的设计规定了一些javascript代码应该阻止用户关闭网页,而不给用户提供一个对话框。这有一个关键问题:这是恶意网站也试图做的事情。 Web 浏览器开发人员致力于防止恶意网站接管用户体验。因此,没有好的方法可以做到这一点。即使我们找到了解决方案,该解决方案也不会是面向未来的,并且会在与浏览器更新一致的情况下在没有警告的情况下中断。

Web 浏览器开发人员为我们提供了一种防止网站关闭的解决方案。该解决方案称为“卸载前解决方案”。 beforeunload 解决方案将为用户提供一个对话框,该对话框中的文本将具有标准化的样板文本,带有“停留”按钮和“离开”按钮。我们可以在该对话框中添加一些文本,但不能删除样板文本,也不能更改、移动或以其他方式操作按钮。 beforeunload 解决方案不灵活,但它是面向未来的。

使用非标准解决方案(也称为 hack)来规避 beforeunload 提供的内容将使我们陷入恶意网站和网络浏览器开发人员之间的军备竞赛,我们将无法保证我们网站的功能将始终如一地工作。恶意网站经常会找到新的技巧和黑客来在屏幕上保留侵入性广告,因此即使我们发现某天允许的内容,下一天也可能会被禁止。互联网上充斥着网络浏览器开发人员已关闭的不再有效的非标准解决方案!

从长远来看, beforeunload 解决方案是唯一可行的解​​决方案,我们需要接受最终用户可以使用任何标准键盘快捷键出于任何原因关闭我们的网站,这是我们防止这种情况发生的唯一方法是一个对话框,要求他们留在网站上。

【讨论】:

  • 不小心按了CTRL-W真的是个问题,有些人想按CTRL-Z(英文键盘W靠近Z)或者CTRL-X(法文键盘W靠近X) (仅仅因为您在互联网上有黑客,就不可能在导航器中执行此警报?您可以将 beforeunload 用于捕获 CTRL-W 之外的其他原因,在这种情况下,您无法检查此退出是否由 CTRL-W 触发
  • 这也是一个问题,当你试图做一个浏览器内的 VIM 编辑器并且人们不能在不关闭编辑器的情况下在插入模式下使用 C-w 退格一个单词。
【解决方案2】:

您可以使用 'beforeunload' 事件避免标签关闭

$(window).on('beforeunload', function(e) {
    if(hasUnsaved()) {
        return 'You have unsaved stuff. Are you sure you want to leave?';
    }
});

见:http://hackab.it/2013/05/page-closing-confirm/

【讨论】:

  • 我已经知道这种方法,但我不想显示任何警报...我只想使用CTRL + W 防止标签关闭。
【解决方案3】:

特别是在 Firefox 中,CTRL+W 不能真正关闭,这很烦人。即使您仅将其计划为您的个人使用,您的配置或设置的更改也可能完成这项工作。

但是,您可以使用 javascript 中的“beforeunload”事件作为解决方法。 确保将第三个参数 (useCapture) 设置为 true,以便在击键被其他任何东西拾取之前拦截击键。

代码如下:

addEventListener(
    'beforeunload',
    function(e){
        e.stopPropagation();e.preventDefault();return false;
    },
    true
);

【讨论】:

  • 你能添加更多关于该代码的描述吗?
【解决方案4】:

试试这个代码:

$(window).keypress(function(event) {
            event.preventDefault();

            if (event.which == 119 && event.ctrlKey) {
                alert("Ctrl-W pressed");
            }    

    return false;
});

【讨论】:

  • 我认为它有效。每当我按下 ctrl+w 时,警报就会按下 Ctrl-W。这是小提琴的例子。 jsfiddle.net/7shkb
  • 此解决方案不再适用于 Firefox 或 IE。
【解决方案5】:

我知道这可能与您的场景无关,但是当您仅使用 CTRL-W 关闭大量选项卡并使用 CTRL-TAB 在之间移动时,我发现 CTRL+SHIFT+W 快捷方式(关闭所有窗口)非常烦人他们。您有时会不小心按住 shift 键,然后 Chrome 会在您刚打算按 CTRL-W 时退出。

所以对于 Windows(不确定你是不是指 Linux,但你可以用 xbindkeys 做同样的事情):

  1. 安装https://www.autohotkey.com
  2. 要在 Windows 上禁用 ^+W 快捷方式,请将其添加到 AutoHotkey.ahk:

(抱歉:如果以下内容没有以“代码”格式显示)

^+w::
SetTitleMatchMode RegEx
IfWinExist, Google Chrome$
{
    WinActivate
}
return

希望这对寻求阻止 Chrome 甚至获得 CTRL-SHIFT-W 组合键的方法的人有用。

【讨论】:

  • 谢谢!嗯,我确实喜欢 CTRL + W 快捷方式,我用它来关闭选项卡。我只想在特定页面上禁用它。 :)
猜你喜欢
  • 1970-01-01
  • 2016-11-21
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2013-08-10
相关资源
最近更新 更多