2

我正在尝试修改使用MooTools将事件侦听器添加到某些字段的页面,如下所示:

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


我需要使用 Greasemonkey/Tampermonkey 删除此行为。我试过了:

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

其中removeEvents是 MooTools 的一个函数,与addEvents.

但是脚本不起作用。(编者注:没有报告错误)

为什么?是因为我的代码是在真实页面的代码之前执行的吗?

4

1 回答 1

1

该事件已安装在页面范围内,但脚本正在脚本范围内运行。此外,根据浏览器和@grant设置,可能涉及沙箱。

因此,要删除该事件,您必须使用脚本注入(Moo 工具似乎不适合使用unsafeWindow.)

此脚本适用于 Greasemonkey 和 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);
}


请注意,没有必要为此添加@requireMoo 工具,因为页面的 Moo 工具实例必须是删除事件的实例。

于 2013-05-10T04:19:45.283 回答