Greasemonkey脚本拦截按键

时间:2013-11-05 09:17:54

标签: javascript firefox greasemonkey

以下用户脚本(将在Firefox中使用Greasemonkey)理论上应该捕获所有网站上的所有Ctrl+t事件,提醒“Gotcha!”,然后阻止网站看到{{1}事件。

但是,它仅适用于某些网站(Google,Stack Exchange),但不适用于其他网站。用户脚本不起作用的一个示例是Codecademy(当代码编辑器具有焦点时),其中Ctrl+t总是切换光标旁边的两个字符。

我禁用了Flash,因此我认为这是一个可以通过JavaScript解决的问题。我可以在脚本中更改哪些内容,以便真正阻止事件进入网站脚本?

Ctr+t

免责声明:我最初在超级用户上询问了broader question这个主题。在试图找到答案时,我偶然发现了这个特定的脚本相关问题。我不是故意双重发帖 - 我只是认为问题的这一部分可能更适合Stack Overflow而不是超级用户。

1 个答案:

答案 0 :(得分:5)

我通过从找到here的另一个用户文件复制两行来修复它。

这改变了document.addEventListener行,更重要的是,改变了最后一行。在Firefox上,!window.opera评估为true。这将作为addEventListener函数的第三个选项参数传递,该函数将useCapture设置为true。这导致事件在较早的“捕获阶段”中触发,而不是在“冒泡阶段”,并且防止网站的另一个eventListener“看到”该事件。

这是工作脚本:

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

// Keycode for 't'. Add more to disable other ctrl+X interceptions
keycodes = [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);