Carlos Garces
Carlos Garces

Reputation: 833

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?

Upvotes: 2

Views: 392

Answers (1)

Brock Adams
Brock Adams

Reputation: 93493

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

Upvotes: 1

Related Questions