2013-05-09 83 views
2

我試圖修改使用MooTools的到事件偵聽器添加到某些領域,像這樣的頁面:使用Greasemonkey腳本刪除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

但該腳本不起作用。 (編者按:沒有報道的錯誤)

爲什麼? 是因爲我的代碼是在真實頁面的代碼之前執行的嗎?

+0

嗯 - 是的 - 可能代碼addEvents在您的代碼後運行。你可以發佈代碼嗎? – Adidi 2013-05-10 00:37:22

回答

1

事件已安裝在頁面範圍內,但腳本正在腳本範圍內運行。另外,根據瀏覽器和@grant設置,可能會涉及一個沙箱。

因此,去除這種情況下,你必須使用腳本注入(武工具似乎並沒有發揮好與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); 
} 


請注意,不需要@require -in Moo工具,因爲Moo工具的頁面實例必須是用於刪除事件的工具。

+0

謝謝,它的工作。 – 2013-05-10 18:45:32

+0

不客氣,樂意效勞。 – 2013-05-10 22:55:07