7

以下用户脚本(在 Firefox 中与 Greasemonkey 一起使用)理论上应该捕获所有Ctrl+t网站上的所有事件,警告“Gotcha!”,然后阻止网站看到该Ctrl+t事件。

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

我禁用了 Flash,所以我认为这是一个可以用 JavaScript 解决的问题。我可以在我的脚本中进行哪些更改,以便它真正防止事件冒泡到网站脚本?

// ==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];  

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!"); //comment this out for real world usage
    }
return false;
});

免责声明:我最初问了一个关于超级用户的更广泛的问题。在尝试寻找答案时,我偶然发现了这个与脚本相关的特定问题。我并不是有意重复发布 - 我只是认为这部分问题可能更适合 Stack Overflow 而不是超级用户。

4

1 回答 1

8

我通过从此处找到的另一个用户脚本复制两行来修复它。

这改变了document.addEventListener行,更重要的是,最后一行。在 Firefox 上,!window.opera计算结果为true. 这作为第三个选项参数传递给addEventListener函数,该函数设置useCapturetrue. 这具有在较早的“捕获阶段”而不是在“冒泡阶段”触发事件的效果,并防止网站的其他 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);
于 2013-11-05T09:47:03.890 回答