Question

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?

Was it helpful?

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top