简体   繁体   中英

How can I use GreaseMonkey to give the browser back the “/” key?

Lots of web pages seem to use the / key for searching. I'd like to disable that because 100% of the time I want to use / to search in the page in FireFox. Is there a way I can override this behavior with GreaseMonkey or dotjs?

The best public example of this is https://www.github.com/ , also https://wiki.jenkins-ci.org/display/JENKINS/Issue+Tracking

  • If you set addEventListener() Doc on window and use "event capture", you will catch 99% of what the page tries to do. (Not counting plugins like Flash)

  • You can't be sure if the page fires off of keydown , keyup , keypress , or some combination, so intercept keydown (the typical event used) and keyup . But, if the page fires off of keypress , then blocking the event may require this kind of technique . This is because the keypress event, on <body> , bubbles up to trigger Firefox's in-page search, but there is no way to (re)trigger that search from javascript (for security).

    Fortunately, your two sample sites do not require any drastic measures.

  • Event constants, like DOM_VK_SLASH are great, but they are still pretty much Firefox-only. From this question's tags (dotjs), it is not clear if you mean for this to work on Chrome, too.

Putting it all together, this complete script works:

// ==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();
    }
}

Note: This script seems to work well on the two sites you listed, in both Chrome and Firefox. And, it will not stop the typing of / into inputs or textareas. But, there is a tiny chance that it might cause some sites to not fire other events on the / key.

If that happens, then use checks like zEvent.target.nodeName == "BODY" to restrict blockSlashKey() 's operation.

This Greasemonkey script work on 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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM