我正在尝试编写Greasemonkey脚本或用户脚本来修复网站中的错误,该错误处理对象的错误功能。我可以通过在生成函数原型的代码行中添加断点来手动修复问题,并使用js控制台手动覆盖函数原型。但是,我不认为有任何方法可以使用代码执行此操作。外部脚本在html主体的末尾加载,但问题代码在同一个脚本中执行。
有没有办法以某种方式将javascript代码注入页面,这样当创建这个Ft.prototype.J时,我可以立即修改它?问题是代码也被混淆和缩小,所以我不确定它的一半是什么。
以下是代码的基本概要:
//What does this do?????
function A(a, b) {
function c() {}
c.prototype = b.prototype;
a.f = b.prototype;
a.prototype = new c;
a.prototype.constructor = a
}
function Ft(a, b) {
$.call(this, b);
//some stuff
}
//doing something with jQuery?
A(Ft, $);
Ft.prototype.J = function (a) {
//modifies the DOM content
};
//Code soon after that calls some object.J
如果我将代码行Ft.prototype.J = function() {} //my own function
添加到我的greasemonkey脚本中,它会按照预期的那样回复错误Ft not defined
。但是,如果我在加载结束时执行该行,则已经运行了已损坏的函数,并且DOM已经被感染。
感谢。
答案 0 :(得分:1)
我认为你可以使用getter / setter和Object.defineProperty
执行一些魔法,因为该函数是全局声明的:
(function() {
var Ft;
function myJ() {
// do whatever YOU want to do
}
Object.defineProperty(window, "Ft", { // use unsafeWindow in GM?
configurable: true,
enumerable: true,
get: function() { return Ft; },
set: function(n) {
// Hah, we've catched the function declaration!
Ft = n;
// just making it non-writable would lead to an exception
Object.defineProperty(Ft.prototype, "J", {
get: function() { return myJ; },
set: function() { /* ignore it! */ }
});
}
});
})();
现在,如果某人执行了您在问题中发布的代码,则会调用setter,您可以使用所需的值。
答案 1 :(得分:1)
不确定,但你基本上可以写一个定时器代码来检查Ft对象是否可用然后修改函数,比如
var interval = setInterval(function() {
if (Ft) {
Ft.prototype.J = function() {} //my own function
clearInterval(interval)
}
}, 0);