我正在研究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,但我需要做这个简单的扩展。
我真的很感谢你的帮助。
答案 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.
}
}