在调用函数之前,在Greasemonkey脚本中执行代码

时间:2012-03-05 19:07:16

标签: javascript function greasemonkey overwrite

我正在研究Greasemonkey脚本。我需要做的是在调用函数之前执行脚本,或者在函数开头执行脚本。

问题是该函数位于文档中,而不是Greasemonkey文件中。这就像覆盖函数一样,但不会覆盖它,因为它必须在脚本完成后执行。

这是我的完整Greasemonkey代码,我不知道我缺少什么:

<pre>// ==UserScript==
// @name           appname
// @version        1.0.0
// @author         me
// @description    blah
// @include        http://www.runhere.net/*
// @exclude        http://www.notinhere.com/*
// @run-at         document-end
// ==/UserScript==

function addJQuery(callback) {
    var script = document.createElement("script");
    script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js");
    script.addEventListener('load', function() {
        var script = document.createElement("script");
        script.textContent = "(" + callback.toString() + ")();";
        document.body.appendChild(script);
    }, false);
    document.body.appendChild(script);
}

function main() {
    var originalFunction = unsafeWindow.add_comment;
    unsafeWindow.add_comment = function(go_last_page) {
        alert("if it is shown, then works!");
        originalFunction.apply(unsafeWindow, new Array(true));
    }
}

//Load JQuery and execute function
addJQuery(main);​</pre>


我需要调用的函数位于页面中,称为add_comment。它有一个布尔类型的参数。我不熟悉javascript,但我需要做这个简单的扩展。

我真的很感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

将函数替换为调用函数的包装函数,然后调用原始函数。

var originalFunction = someObject.someFunction;

someObject.someFunction = function() {

    executeMyScript();
    return originalFunction.apply(someObject, arguments);

}

答案 1 :(得分:0)

您可以将该功能保存到变量中,然后覆盖该功能。

示例:

var _func = functionIWant;
functionIWant = function(){
   // Do whatever
   _func(); // Call original function
}

答案 2 :(得分:0)

该代码通过main()方法将addJQuery()注入目标页面。这意味着使用unsafeWindow是不合适的 - 这将是未定义的。

此外,在这种情况下,您可能不需要使用.apply()。最后,代码使用的变量go_last_page似乎没有在任何地方定义。

所以代码是:

function main () {
    var originalFunction    = add_comment;
    add_comment             = function (/*go_last_page*/) {
        alert ("if it is shown, then works!");
        /* This next line is probably not needed.  "this" and "arguments" are
            special JS variables.
        originalFunction.apply (this, arguments);
        */
        originalFunction (true);  //-- Simplified call is probably sufficient.
    }
}