Search code examples
greasemonkeymootoolstampermonkeymootools-events

Remove MooTools events using a Greasemonkey script?


I'm trying to modify a page that uses MooTools to add event-listeners to some fields, like so:

$('inputPassword').addEvents({
    keypress: function(){
        new WorkspaceModalbox({'href':'someurl.phtml', 'width':500, 'height':140, 'title':'foo'});
    }
});


I need to remove this behavior using Greasemonkey/Tampermonkey. I tried:

// ==UserScript==
// @require  http://userscripts.org/scripts/source/44063.user.js
// ==/UserScript==
window.addEventListener("load", function(e) {
    $('inputPassword').removeEvents('keypress');
}, false);

where removeEvents is a function from MooTools, the opposite one to addEvents.

But the script doesn't work. (Editor's note: There are no reported errors)

Why? Is it because my code is executed before the code from the real page?


Solution

  • The event was installed in page scope but the script is running in script scope. Also, depending on the browser and on the @grant settings, there may be a sandbox involved.

    So, to remove that event, you must use script injection (Moo tools doesn't seem to play nice with unsafeWindow.)

    This script works on both Greasemonkey and Tampermonkey:

    // ==UserScript==
    // @name     _Remove a Moo event listener
    // @include  http://YOUR_SERVER.COM/YOUR_PATH/*
    // @grant    GM_addStyle
    // ==/UserScript==
    /*- The @grant directive is needed to work around a design change
        introduced in GM 1.0.   It restores the sandbox.
    */
    
    window.addEventListener ("load", function (e) {
        addJS_Node ("$('inputPassword').removeEvents('keypress');");
    }, false);
    
    
    //-- addJS_Node is a standard(ish) function
    function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
        var D                                   = document;
        var scriptNode                          = D.createElement ('script');
        if (runOnLoad) {
            scriptNode.addEventListener ("load", runOnLoad, false);
        }
        scriptNode.type                         = "text/javascript";
        if (text)       scriptNode.textContent  = text;
        if (s_URL)      scriptNode.src          = s_URL;
        if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';
    
        var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
        targ.appendChild (scriptNode);
    }
    


    Note that there is no need to @require-in Moo tool just for this, since the page's instance of Moo tools must be the one to remove the event(s).