如何使用GreaseMonkey为浏览器提供“/”键?

时间:2013-04-20 16:36:20

标签: javascript greasemonkey dotjs

很多网页似乎都使用 / 键进行搜索。我想禁用它,因为100%的时间我想用 / 在FireFox的页面中搜索。有没有办法可以用GreaseMonkey或dotjs覆盖这种行为?

最好的公开示例是https://www.github.com/,还有https://wiki.jenkins-ci.org/display/JENKINS/Issue+Tracking

2 个答案:

答案 0 :(得分:4)

  • 如果您在window上设置addEventListener()Doc并使用“事件捕获”,则会抓住该网页尝试执行的99%。 (不计算像Flash这样的插件)

  • 您无法确定该网页是否会触发keydownkeyupkeypress或某些组合,因此拦截keydown(典型使用的事件)和keyup。但是,如果页面触发keypress,则阻止该事件可能需要this kind of technique。这是因为keypress上的<body>事件会触发Firefox的页内搜索,但是没有办法(重新)从javascript触发搜索(为了安全起见)。

    幸运的是,您的两个样本网站不需要采取任何严厉措施。

  • 事件常量,如DOM_VK_SLASH非常棒,但它们仍然只是Firefox版本。从这个问题的标签(dotjs)来看,目前还不清楚你是否也想在Chrome上工作。

总而言之,这个完整的脚本有效:

// ==UserScript==
// @name        _Nuke the forward slash on select pages
// @include     https://github.com/*
// @include     https://wiki.jenkins-ci.org/*
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

//-- "true" tells the listener to use capture mode.
window.addEventListener ('keydown',  blockSlashKey, true);
window.addEventListener ('keyup',    blockSlashKey, true);
/*-- Don't block keypress on window or body, this blocks the default
    page-search, too.
window.addEventListener ('keypress', blockSlashKey, true);
*/

function blockSlashKey (zEvent) {
    var FORWARD_SLASH   = 191;  // For keydown and keyup
    var ASCII_SLASH     = 47;   // For keypress

    if (    zEvent.which === FORWARD_SLASH
        || (zEvent.which === ASCII_SLASH  &&  zEvent.type == "keypress")
    ) {
        zEvent.stopPropagation();
    }
}

注意:此脚本似乎适用于您列出的两个网站,包括Chrome和Firefox。并且,它不会停止将 / 键入输入或textareas。但是,它很可能会导致某些网站无法在 / 键上触发其他事件。

如果发生这种情况,请使用zEvent.target.nodeName == "BODY"之类的检查来限制blockSlashKey()的操作。

答案 1 :(得分:-1)

此Greasemonkey脚本适用于Firefox

// ==UserScript==
// @name        Disable slash key on page
// @namespace   test
// @include     https://github.com/*
// @include     https://wiki.jenkins-ci.org/*
// @grant       none
// @version     1
// ==/UserScript==

document.addEventListener('keydown', function(event) {
    if (event.keyCode === event.DOM_VK_SLASH) {
        event.stopPropagation();
    }
}, true);