如何禁止Firefox中的网站窃取键盘快捷方式


57

许多网站,尤其是涉及富文本编辑的所有网站(此网站也有罪),都窃取了通常用于控制Firefox的键盘快捷键,而改为执行其他操作。当我按Cmd-number,Cmd-L,Cmd-T或Cmd-K之类的命令时,这真是太令人生气了,但它并没有实现我想要的功能。我可以停止吗?

实际上,如果我可以禁止窃取所有Cmd- *快捷方式,那可能是最好的。我从未见过它们用于任何有用的东西。可能吗?


4
同意,这真令人发指。FogBugz具有非常好的键盘快捷键实现。 CTRL-;进入快捷方式并突出显示屏幕上所有可用快捷方式的命令。每个快捷方式都是一个组合,因此新的情况是CTRL-; N,编辑为CTRL-; E。非常容易习惯和零冲突。我希望更多的网站会使用这样的内容,因为这对用户来说更容易,并且不会覆盖浏览器的快捷方式。不幸的是,SuperUser不能执行此操作,因为它与FogBugz来自同一个人。
山姆


1
正在Bugzilla按此功能要求进行讨论。
机械蜗牛

我在工作中访问了许多Intranet页面,它们以某种方式弄乱了cmd + N,所以我永远无法通过键盘打开新的浏览器窗口!很烦人!
Nicolas Miari '16

1
大约12年后,Mozilla为此稳定了一个相当合理的修复程序。它是隐藏的和不完美的,但是可以节省您的理智。请在这里查看我的答案:superuser.com/a/1317514/158390
Lambart

Answers:


24

感谢Greasemonkey的新@run-at财产,现在可以做到这一点!

我从这个脚本这个脚本中得到了启发,将它们组合成一个Userscript,成功截获了键盘快捷键Ctrl+ TCtrl+ S。我在Firefox 17 ESR和Firefox 25中进行了测试。

// ==UserScript==
// @name           Disable Ctrl+s and Ctrl+t interceptions
// @description    Stop websites from highjacking keyboard shortcuts
//
// @run-at         document-start
// @include        *
// @grant          none
// ==/UserScript==

// Keycode for 's' and 't'. Add more to disable other ctrl+X interceptions
keycodes = [83, 84];  

(window.opera ? document.body : document).addEventListener('keydown', function(e) {
    // alert(e.keyCode ); //uncomment to find more keyCodes
    if (keycodes.indexOf(e.keyCode) != -1 && e.ctrlKey) {
        e.cancelBubble = true;
        e.stopImmediatePropagation();
    // alert("Gotcha!"); //ucomment to check if it's seeing the combo
    }
    return false;
}, !window.opera);

1
这非常有帮助。OS X用户应该换出e.ctrlKeye.cmdKeye.cmdKey && e.shiftKey收回大部分的浏览器的快捷键。
JamesGecko 2014年

这个脚本对我有用,可以通过添加9到keycodes数组来修复CTRL + TAB 。谢谢!
Mike Mueller

@JamesGecko通过答案可以找到您应该/可以使用e.metaKey作为命令键。
riezebosch 2015年

3
此代码有效!请记住,它不仅过滤Ctrl + Key,而且过滤Ctrl + Alt + Key,Ctrl + Shift + Key和Ctrl + Alt + Shift + Key,因为它仅检查Ctrl修饰符的状态。
RomanSt

第一个问题:对于在Firefox上运行良好的脚本,为什么要检查浏览器是否为Opera?第二个问题:注释中的字符代码为“ s”和“ t”,但实际上是“ S”和“ T”的字符代码。是否出于某种原因需要指定大写代码?谢谢。
道格拉斯于2015年

8

提交此错误11年后,Mozilla终于能够处理此受欢迎的功能请求,并且现在看来还可以(在Firefox 66.0.3 / Ubuntu中测试)。

(感谢@PerJohansson指出,自FF 59以来,它们使查找设置变得更加困难。)

您可以按照以下步骤禁用网站快捷方式:

  1. 点击(i)位置栏中的图标
  2. 单击>“连接”状态项右侧的小箭头()。
  3. 现在,您应该More Information在底部看到。单击该Page Info按钮,您将最终进入对话框。
  4. 最后,转到Permissions标签并调整Override Keyboard Shortcuts设置。

这是每个步骤的最近(2019年5月)屏幕快照:

Firefox站点信息对话框屏幕快照

Firefox站点安全对话框屏幕快照

Firefox的“权限”选项卡的屏幕截图

如果您对此修复程序的历史感兴趣,请查看以下相关Mozilla票证:https : //bugzilla.mozilla.org/show_bug.cgi?id=380637https://bugzilla.mozilla.org/show_bug.cgi ?id = 1445942


2
在Firefox 64中(不确定它的出现位置),您必须单击“ Connection” =>“ More information”以访问此idalog框。权限齿轮进入“首选项”,而不是正确的位置。
Per Johansson

感谢@PerJohansson,我已更新票证。
兰巴特

有什么about:config选项可以更改默认值?我要强制所有站点无法挂接到我的键盘上
inetknght

5

广泛的研究表明,从当前版本的Firefox(3.6.x)开始,这是不可能的-所有键绑定冲突都按照优先级解决:系统>网站> Firefox-相当愚蠢的命令。我尝试过的所有插件似乎都无法修复它。

它可能在将来的版本中变得可行,但现在的答案是-不可能。


1
将近4年后使用FF 30.0,这仍然是一个问题。我将尝试马丁的Greasemonkey想法。
LGT 2014年

2
将近8年后使用FF 53.0,这仍然是一个问题。
丹尼尔(Daniel)

5

由于问题似乎是JavaScript键盘事件窃取了按键,因此无法构建一个JavaScript脚本(通过Greasemonkey使用)来解除所有键盘事件的绑定,从而将每个快捷方式的正确用法返回给浏览器吗?

我不确定这是否可行,但是具有JavaScript / Greasemonkey经验的人也许可以提供帮助(可能值得一提)。


2
这通过onKeyPress机制起作用-Firefox首先将每个按键发送到网站,然后仅在未取消或拦截的情况下才对其进行查看。某些Greasemonkey魔术可能会在网站访问之前拦截按键并以某种方式直接运行firefox功能,但这还不是很明显。
TAW

4

问题在于,任何页面都可以运行设置了事件处理程序以捕获按键事件的Javascript,并且Firefox的javascript控件不够精细,无法在不破坏其他javascript功能的情况下将其停止。

防止这种情况的唯一方法是禁用Javascript(“工具”->“选项”,““内容””选项卡,取消选中“ 启用JavaScript”)。或者,您可以使用NoScript之类的扩展名在每个站点上禁用Javascript。

Firefox使您可以防止某些 Javascript使用,例如移动/调整窗口大小,更改或禁用上下文菜单等;但是没有什么可以阻止网站拦截键盘事件的。

也许有一个扩展可以提供这种控制级别-我不知道。
Javascript Options,但是该扩展名不再被更新。


2
我尝试过的Javascript选项和其他一些扩展不支持此功能。阻止所有JavaScript将使网络几乎无法使用,这实际上不是一个选择。
TAW

0

第三方插件可能正在从主浏览器窗口获取焦点。在这种情况下,键盘输入(中断除外)将被插件拦截。如果您不喜欢这样,可以随时删除有问题的插件[我认为这可能是Flash]。


3
Flash也可以这样做,但是普通的Javascript可以窃取快捷方式。在此处开始一个新问题,然后在问题文本窗口中按Cmd-L(在非Mac电脑上为Ctrl-L)。快捷方式将被窃取,而您将看到一些“插入超链接”对话框,而不是去应该的网址栏。它曾经很罕见,但是最近有太多的网站开始这样做。
taw

我只是在运行Firefox的Windows 7上尝试过,然后像往常一样直接跳到地址栏。
大雪

抱歉,我不清楚-仅在选择了富文本框对话框时才会发生。是你做的吗?我在OSX上使用Firefox,Opera,Safari和Chrome进行了测试。通常,在所有四个命令中,Cmd-L都会跳转到网址栏(而Ctrl-L则不执行任何操作)。编辑问题正文时,Cmd-L和Ctrl-L都显示“插入超链接”对话框。
taw

看起来你是对的。我不知道如何防止这种情况。:(这是一个有趣的问题,所以我现在正在upvoting你的问题如果无人应答它我会扔就可以了赏金。
大拙

问题不在于插件。插件本身是一个单独的问题。毕竟是另一个问题。在插件中,所有焦点都被插件窃取了,因为它是一个单独的实体。使用JavaScript,firefox UI是JavaScript,并具有自己的绑定,但是站点可以定义相同级别的绑定。到目前为止,仍然没有防止这种情况的机制。
njsg

0

在各种浏览器上进行了大量测试之后,当按下(未按下)键时,截取键会更容易,因为某些“应用程序集成键”很难通过“ keypress”事件截取。

我想出了与跨浏览器兼容的脚本(我没有测试Microsoft的IE)。请注意,浏览器为某些键返回不同的代码。就我而言,我想阻止Ctrl + P。

chrome上的键“ P”被视为e.keyCode == 80,歌剧上为e.charCode == 16,而Firefox上为e.charCode == 112

$(document).on('keydown', function(e) {
    if(e.ctrlKey && (e.key == "p" || e.charCode == 16 || e.charCode == 112 || e.keyCode == 80) ){
        alert("Please use the Print PDF button below for a better rendering on the document");
        e.cancelBubble = true;
        e.preventDefault();

        e.stopImmediatePropagation();
    }  
});

我用的是jQuery。


0

如果要禁用该网页所接管任何 ctrl键,只需从az过滤所有字母的代码(以先前接受且有效的答案为基础)

// ==UserScript==
// @name           Disable Ctrl+key interceptions
// @description    Stop websites from highjacking keyboard shortcuts
//
// @run-at         document-start
// @include        *
// @grant          none
// ==/UserScript==

(window.opera ? document.body : document).addEventListener('keydown', function(e) {
    //alert(e.keyCode ); //uncomment to find more keyCodes
    if( e.ctrlKey && e.keyCode>=65 && e.keyCode<=90 ) {
        e.cancelBubble = true;
        e.stopImmediatePropagation();
    }
    return false;
}, !window.opera);

-1

也许您可以使用这些程序之一的Autohotkey或Autoit,如果可以执行热键组合并将其链接到firefox函数,请说

Ctrl-; T 到新标签页

Ctrl-; N 转到新窗口,依此类推。

我不知道如何使用Autohotkey或Autoit,因此其他人将不得不验证这是否可行,我只是将其作为一个潜在的想法。


-2

Firefox当前版本使我们能够“禁用JavaScript劫持上下文菜单”:

工具/选项/内容/启用Javascript高级/禁用或替换上下文菜单

但是没有“禁用JavaScript劫持键盘快捷键”的功能。

ps。我讨厌twitter网站,它的键盘快捷键与我基于系统的键盘快捷键冲突:J,K,L,I

我已经在bugzilla.mozilla.org上提出了功能请求,请在此处发表评论:https ://bugzilla.mozilla.org/show_bug.cgi?id =775002

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.