Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 228
Frew Schmidt Avatar asked Apr 20 '13 16:04

Frew Schmidt


People also ask

Is greasemonkey the same as Tampermonkey?

Tampermonkey is used to run so-called userscripts (sometimes also called Greasemonkey scripts) on websites. Userscripts are small computer programs that change the layout of a page, add or remove new functionality and content, or automate actions.

How do I write a script in Tampermonkey?

Tampermonkey has it's own built-in editor. Just hit the Tampermonkey button and select Dashboard. To get a new script, hit the little + tab in the upper right. You'll get a nice template with an IIFE (Immediately Invoked Function Expression) that you should put all your code in to avoid global namespace pollution.


1 Answers

  • 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.

like image 175
Brock Adams Avatar answered Oct 20 '22 09:10

Brock Adams